Google всегда возвращает истекший идентификатор id (JWT)

Согласно https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInApi.html#constant-summary

Если вы используете время истечения срока годности идентификатора, чтобы определить время жизни сеанса, вы должны получить обновленный токен идентификатора, вызвав silentSignIn перед каждым вызовом API на ваш сервер приложений.

Я пытаюсь получить новый токен, вызвав silentSignIn. Но я всегда получаю одинаковый токен ID. Может кто-нибудь, пожалуйста, помогите мне указать правильную документацию, которая показывает, как принудительно обновить, чтобы получить новый токен. Мой код ничего особенного. Это почти то же самое, что и у нас в образце Google.

private void buildGoogleApiClient() { // Configure sign-in to request the user's ID, email address, and basic profile. ID and // basic profile are included in DEFAULT_SIGN_IN. GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) //.requestServerAuthCode(serverClientId) .requestIdToken(SERVER_ID) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestEmail() .build(); // Build a GoogleApiClient with access to GoogleSignIn.API and the options above. mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); } 

Я создаю свой API, как указано выше, и когда пользователь нажимает на логин с помощью кнопки google, я выполняю следующее действие

 OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); if (opr.isDone()) { // If the user's cached credentials are valid, the OptionalPendingResult will be "done" // and the GoogleSignInResult will be available instantly. Timber.d("Got cached sign-in"); GoogleSignInResult result = opr.get(); handleSignInResult(result); } else { // If the user has not previously signed in on this device or the sign-in has expired, // this asynchronous branch will attempt to sign in the user silently. Cross-device // single sign-on will occur in this branch. Timber.d("Checking if user has already given access to this app on an other device."); showProgressDialog(); opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { @Override public void onResult(GoogleSignInResult googleSignInResult) { hideProgressDialog(); handleSignInResult(googleSignInResult); } }); } 

Метод handleSignInResult получит идентификатор id как

 GoogleSignInAccount acct = result.getSignInAccount(); String idToken = acct.getIdToken(); Timber.d(acct.getIdToken()); 

ИЗМЕНИТЬ 1

У меня есть другой вопрос.

После того как я отозвал разрешение с https://security.google.com/settings/u/1/security/permissions, я все еще мог получить идентификатор-токен (JWT). Предположим, что этот токен кэширован, а сервисы Android play предоставляют его из локальной копии. После окончания токена (60 минут) игровая служба должна связаться с сервисом Google, чтобы получить последний статус. Но я этого не вижу. На самом деле, еще одна странная вещь, которую я заметил, когда я вызываю silentSignIn () после дня или около того, я получаю новый токен без согласия пользователя. Может кто-нибудь, пожалуйста, проверите этот вариант использования и дайте мне знать результат.

Как я могу удостовериться, что пользователь попросил дать разрешение снова, когда он его отозвал.

Вам нужно будет использовать startActivityForResult() , а затем обработать результат входа в onActivityResult() , как описано здесь. Интеграция входа Google в ваше приложение для Android . Затем, чтобы проверить подлинность токена, см. Руководство Google для входа в Google для Android о том, как аутентифицироваться на сервере .

Простым способом является передача маркера в конечную точку Google tokeninfo https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123 где XYZ123 – ваш токен.