2016-08-03 58 views
5

Ich habe die Handbücher auf https://developers.google.com/ verfolgt und ich kann das Google ID-Token des angemeldeten Benutzers erhalten, nachdem der Benutzer angemeldet ist. Aber ich habe festgestellt, dass das Token in 1 Stunde abläuft. Ich kann keine offizielle Referenz finden, die mir erklärt, wie ich mit dem abgelaufenen Google ID-Token umgehen muss. Daher kann ich den Nutzer nur bitten, erneut auf den Google-Anmelde-Button zu klicken.Wie wird das ID-Token aktualisiert, nachdem es bei der Integration von Google Sign-in auf Android abgelaufen ist?

Wie kann ich ein gültiges Google ID-Token aktualisieren, nachdem das alte abgelaufen ist, ohne dass der Benutzer sich immer wieder manuell anmelden muss?

Antwort

3

Ja, Google ID-Tokens werden für eine Stunde Gültigkeit ausgestellt und laufen ab, Sie können einfach silentSignIn in Ihrer App verwenden, um eine neue ohne Benutzerinteraktion zu erhalten. Wenn Ihr vorhandenes Token noch nicht abgelaufen ist, erhalten Sie die (zwischengespeicherte) Version zurück (OptionalPendingResult zurückgegeben hat isDone() == true); Wenn es bereits abgelaufen ist, erhalten Sie eine aktualisierte (aber es wird ein wenig länger dauern und somit OptionalPendingResult isDone() wird false sein).

Hier ist sample code (UI-Thread finden Sie unter etwa einem Arbeitsthread beachten):

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(getString(R.string.server_client_id)) 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 
... 

    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. 
     Log.d(TAG, "Got cached sign-in"); 
     GoogleSignInResult result = opr.get(); 
     handleSignInResult(result); // result.getSignInAccount().getIdToken(), etc. 
    } 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. 
     opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
      @Override 
      public void onResult(GoogleSignInResult googleSignInResult) { 
       handleSignInResult(googleSignInResult); // result.getSignInAccount().getIdToken(), etc. 
      } 
     }); 
    } 

Beachten Sie, ob Sie silentSignIn auf einem UI-Thread oder Worker-Thread aufrufen. Wenn Sie es auf Worker-Thread aufrufen, schauen Sie sich diesen Beitrag mit blockingConnect() + await() an, der den Code sehr vereinfacht: Silent sign in to retrieve token with GoogleApiClient