Каков правильный способ проверки доступных токенов OAuth на сервере node.js?

Я пытаюсь аутентифицировать мобильное приложение для платформы Android на пользовательский node.js-сервер api. Я хотел бы использовать токены Google OAuth2 для этого, вместо того чтобы откатывать мою собственную аутентификацию, поскольку устройства Android с установленным Google Play делают это доступным для разработчиков приложений. Я использую вызов GoogleAuthUtil.getToken из библиотеки Служб Google Play, зарегистрированный здесь. Я пытаюсь следовать советам, изложенным в этой блоге разработчиков разработчиков Android

Метод getToken возвращает в моем случае длинную строку длиной 857 байт. Если я попытаюсь передать этот токен в конечную точку Google TokenInfo, он возвращает:

{'error': 'invalid_token', 'error_description': 'Недопустимое значение'}

Что я здесь делаю неправильно? В "области" вызова getToken я отправляю: audience:server:client_id:**i_put_my_clientid_here**. У меня есть клиент, сгенерированный для "установленных приложений". Используя этот идентификатор клиента, вызов getToken не работает вообще. Когда я создавал идентификатор клиента для "учетной записи службы", вызов преуспевает, но я получаю токен 857 байт, который терпит неудачу при передаче в конечную точку TokenInfo, как описано выше.

EDIT: Я также создал идентификатор клиента для "веб-приложений", поскольку, как представляется, это правильный идентификатор клиента, который используется при вызове getToken. Но поведение такое же, я возвращаю токен 857 байт, который не проверяется при вызове конечной точки Google.

Как я могу правильно получить действительный токен аутентификации с помощью сервисов Google Play на Android? Как только у меня есть правильный токен, какая библиотека node.js, чтобы проверить ее на стороне сервера? Могу ли я использовать passport-google-oauth?

Ответ 1

Если вы просто хотите прочитать содержимое данных, возвращаемых GoogleAuthUtil.getToken, то процесс очень прост. Возвращенные данные - это просто JWT. Итак, все, что вам нужно сделать, это разделить данные символом ., а затем base64 (url) декодировать каждую часть.

Это немного сложнее, если вы хотите проверить подлинность сообщения. Просто используйте свою любимую библиотеку криптографии для проверки. Третий компонент JWT является сигнатурой данных и сертификаты Google доступны для общественности; что все, что вам нужно, чтобы проверить сообщение.

Ответ 2

Hm, на самом деле это комментарий, а не ответ, но я не могу вставить в него символы новой строки:

  • он должен быть идентификатором Clent на веб-стороне, который идет в месте put_my_clientid_here.
  • если GoogleAuthUtil.getToken() дает вам строку с броском исключения, она действительно должна быть действительной. Когда вы нажимаете tokeninfo, вы использовали... tokeninfo? Id_token = < 857-byte-value-here >
  • Если вы рубист, возьмите драгоценный камень google-id-token и посмотрите, может ли он подтвердить ваш токен с 857 байтами.

Ответ 3

В течение недели я изучал, как проверять токены GoogleAuthUtil, полученные в приложении Android Client, на сервере Node.js, используя паспорт .js

Наконец, я наткнулся на паспорт-google-символическую паспортную стратегию, которая прекрасно выполняет задачу.

https://www.npmjs.com/package/passport-google-token

Более подробная информация представлена ​​в приведенной выше ссылке.

Ответ 5

Я не слишком хорошо разбираюсь в деталях работы Android в отношении передачи маркера с устройства на сервер. Мое общее впечатление, однако, заключается в том, что вы не проходите через типичный танцевальный танец OAuth. Вместо этого вы напрямую вызываете конечную точку "пользовательская информация", которая возвращает информацию, соответствующую пользователю, который содержит токен, или отклоняет запрос, если токен недействителен. Там некоторое обсуждение этого смежного вопроса:

проверка подлинности Android на стороннем сервере

По сути, токен становится секретом, который разделяется между устройством и вашим сервером, поэтому его важно защитить.

Существует несколько стратегий для Facebook и Twitter, которые были разработаны для выполнения аналогичных действий с использованием токенов с устройств iOS:

https://github.com/drudge/passport-twitter-token
https://github.com/drudge/passport-facebook-token

Вы можете немного вдохнуть их и настроить, чтобы поговорить с конечными точками Google. Дайте мне знать, как это получается. Мне бы хотелось увидеть аналогичную стратегию "паспорт-google-токен", поэтому, если вы ее реализуете, дайте мне знать, и я свяжусь с ней!