Ответ 1
Вам не нужно использовать app_id
для получения маркера oauth, вам просто нужно изменить область действия
"oauth2:" + Scopes.PLUS_LOGIN
В этом случае ваша область может быть plus.login
Дополнительная информация:
Я использую следующее, чтобы получить аутентификацию, доступную для бэкэнд из приложения 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", если я правильно помню).
Код не всегда работает (на моем сервере), и я хотел бы иметь возможность проверить, может ли код использоваться или истек.
Вам не нужно использовать app_id
для получения маркера oauth, вам просто нужно изменить область действия
"oauth2:" + Scopes.PLUS_LOGIN
В этом случае ваша область может быть plus.login
Дополнительная информация:
Как вы можете видеть в Документация по документу:
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. Пожалуйста, попробуйте добавить его, потому что кажется обязательным использование идентификатора кросс-клиента.
Токен, полученный с помощью GoogleAuthUtil.getToken()
таким образом, не является токеном доступа, это токен идентификатора.
Попробуйте вместо этого использовать следующий URL (обратите внимание id_token
на параметр запроса вместо access_token
):
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=<ID TOKEN>