Подтвердить что ты не робот

GoogleAuthUtil.getToken возвращает недопустимый код аутентификации

Я использую следующее, чтобы получить аутентификацию, доступную для бэкэнд из приложения Android. Это описано здесь https://developers.google.com/identity/protocols/CrossClientAuth.

StringBuffer sb = new StringBuffer();
sb.append("oauth2:server:client_id:");
sb.append(getString(R.string.google_app_id));
sb.append(":api_scope:");
sb.append("profile email");
final String scope = sb.toString();
String token = GoogleAuthUtil.getToken(Activity.this, mAuthAccount, scope);

(mAuthAccount ранее был установлен с помощью AccountPicker.newChooseAccountIntent.)

Вышеприведенный код возвращает код проверки подлинности, который иногда истек. Я хотел бы проверить его на серверах google, но вызывая https://www.googleapis.com/oauth2/v1/tokeninfo?access_token= с возвращенной строкой токена из GoogleAuthUtil.getToken возвращает "недопустимый токен".

Как проверить, что код проверки подлинности не истек, прежде чем я попытаюсь его использовать?

Изменить: возвращаемая строка не является токеном, а авторизационным кодом, который можно обменять с помощью API Google для получения токена. Возвращенная строка начинается с "/4", а не "/1" или "/2", если я правильно помню).

Код не всегда работает (на моем сервере), и я хотел бы иметь возможность проверить, может ли код использоваться или истек.

4b9b3361

Ответ 1

Вам не нужно использовать app_id для получения маркера oauth, вам просто нужно изменить область действия

"oauth2:" + Scopes.PLUS_LOGIN

В этом случае ваша область может быть plus.login

Дополнительная информация:

Авторизация API для API REST

Класс объектов

Ответ 2

Как вы можете видеть в Документация по документу:

https://www.googleapis.com/oauth2/v1/tokeninfo

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

Ниже приведен пример такого запроса:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg

Конечная точка TokenInfo ответит массивом JSON, который описывает токен или ошибку.

На проводе ответ выглядит примерно так:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"profile email",
  "expires_in":436
}

Если токен истек, был изменен или разрешен аннулируется, сервер авторизации Google ответит с ошибкой. Ошибка отображается как код состояния 400 и тело JSON следующим образом:

{"error":"invalid_token"}

По дизайну дополнительная информация не указана в отношении причины сбоя.

Итак, invalid_token является допустимым ответом, когда токен истек, был изменен или отменены разрешения

ИЗМЕНИТЬ

Можно получить invalid_token сразу после того, как токен возвращается из GoogleAuthUtil.getToken, поскольку GoogleAuthUtil может его кэшировать. В этом случае вы должны вызвать GoogleAuthUtil.invalidateToken.

Дополнительную информацию вы можете найти здесь: http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html

РЕДАКТИРОВАТЬ 2

Я просто замечаю, что в вашей области отсутствует https://www.googleapis.com/auth/plus.login. Пожалуйста, попробуйте добавить его, потому что кажется обязательным использование идентификатора кросс-клиента.

Ответ 3

Токен, полученный с помощью GoogleAuthUtil.getToken() таким образом, не является токеном доступа, это токен идентификатора.

Попробуйте вместо этого использовать следующий URL (обратите внимание id_token на параметр запроса вместо access_token):

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=<ID TOKEN>