OAuth2ErrorException invalid_token при проверке токена в GoogleAuthUtil.getToken() Google+ на сервере

Впервые использую Google+ API. У меня есть приложение с веб-клиентом и клиентом Android, которое использует G+ для аутентификации. Веб-клиент работает хорошо. У меня есть «Идентификатор клиента для веб-приложения», настроенный в консоли Google API, который я использую для получения токена с помощью клиента javascript.

Клиент javascript использует следующую кнопку (в основном дословно взятую из демонстрационного приложения Google):

<button class="g-signin"
       data-scope="https://www.googleapis.com/auth/plus.login"
       data-requestvisibleactions="http://schemas.google.com/AddActivity"
       data-clientId="my_web_application_client_id"
       data-callback="onSignInCallback"
       data-theme="dark"
       data-cookiepolicy="single_host_origin">

Я проверяю на сервере Python с помощью:

url = ('https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=%s' % token)
 h = httplib2.Http()
  result = json.loads(h.request(url, 'GET')[1])

Все идет нормально. Токен проходит проверку, как и ожидалось.

Теперь для приложения Android... Я установил «Идентификатор клиента для приложения Android» для того же проекта с отпечатком отладки, сгенерированным: keytool -exportcert -alias androiddebugkey -keystore debug.keystore -list -v

Пакет для имени идентификатора клиента соответствует тому, что указано в моем манифесте Android.

Я использую GoogleAuthUtil для создания токена в своем приложении для Android:

String token =
  GoogleAuthUtil.getToken(
    this,
    "[email protected]",
    "oauth2:server:client_id:<client_id>:" +
      "api_scope:https://www.googleapis.com/auth/plus.login");

Если я использую свой недавно созданный идентификатор клиента приложения для Android, я получаю: GoogleAuthException: com.google.android.gms.auth.GoogleAuthException: Unknown

Я еще не понял этого, но некоторые решения намекают, что я должен просто использовать идентификатор клиента веб-приложения и что исключение работает по назначению.

Если я использую свой идентификатор клиента веб-приложения, то все работает нормально, и токен возвращается, но когда я отправляю токен на свой сервер для проверки, токен отклоняется:

{u'error_description': u'Invalid Value', u'debug_info': u'code: INVALID_VALUE
http status: 400
arguments: [invalid_token]
cause: com.google.security.lso.protocol.oauth2.common.OAuth2ErrorException:\
 invalid_token at
com.google.security.lso.grant.token.TokenManager.getTokenInfo(TokenManager.java:603) at
com.google.security.lso.apiary.tokeninfo.TokenInfoAction.execute(TokenInfoAction.java:92)

Я проверил, что токен, прибывающий на сервер, тот же, что и в приложении (без случайных пробелов и т. д.).

Любые идеи, что я делаю неправильно? Спасибо за любые предложения!


person benster310    schedule 20.07.2014    source источник


Ответы (1)


В итоге я сделал следующее:

При вызове GoogleAuthUtil вместо следующей области:

oauth2:server:client_id:<client_id>:api_scope:https://www.googleapis.com/auth/plus.login

Я использовал:

audience:server:client_id:<client_id>

где client_id — это идентификатор веб-клиента.

Это создает гораздо более длинный токен. Вы можете расшифровать/аутентифицировать этот токен через:

https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=<token>

Обратите внимание, что ключом параметра запроса является id_token, а не access_token.

Сервер отвечает следующим:

{
 "issuer": "accounts.google.com",
 "issued_to": "<android_client_id>",
 "audience": "<web_client_id>",
 "user_id": "<some_long_integer>",
 "expires_in": 3354,
 "issued_at": 1406474776,
 "email": "<email address passed to GaiaAuthUtil>",
 "verified_email": true
}

Затем на вашем сервере вы:

  1. Убедитесь, что аудитория и строки issue_to соответствуют вашим ожиданиям.
  2. Убедитесь, что идентификатор пользователя/адрес электронной почты авторизован

затем продолжите обработку запроса.

Это решение представляет собой смесь информации из других обсуждений StackExchange и этого руководства: http://android-developers.blogspot.com/2013/01/verifying-back-end-calls-from-android.html

Надеюсь, это сэкономит кому-то время!

person benster310    schedule 27.07.2014