2016-07-28 65 views
2

Ich verwende die Google-Anmeldung in meiner App und sende das ID-Token an meinen Backhand-Server, sobald der Nutzer sich angemeldet und das ID-Token abgerufen wurde. Vorläufig werde ich das ID-Token dem Header jeder HTTP-Anfrage hinzufügen, und ich validiere es, erhalte die Benutzer-ID und antworte auf meine App. Ich frage mich, ob es in Ordnung ist, das ID-Token persistent zu speichern und es für alle zukünftigen Anfragen zu verwenden. Wird das ID-Token einige Zeit ändern oder ablaufen? Wenn ja, wie erhält man ein neues ID-Token? Ich kann keinen anderen Ansatz finden, als den Benutzer zur erneuten Anmeldung aufzufordern. Oder sollte ich den ID-Token nur einmal validieren und ID direkt in zukünftigen Anfragen verwenden?Soll ich das ID-Token dauerhaft in Google anmelden?

Antwort

2

Speichern Sie kein ID-Token. 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