2016-05-21 11 views
8

Nach https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInApi.html#constant-summaryGoogle liefert immer abgelaufen ID-Token (JWT)

Wenn Sie die ID-Token Ablaufzeit verwenden, um Ihre Lebensdauer einer Sitzung, um festzustellen, sollten Sie eine aktualisierte ID-Token abrufen, durch Aufrufen silentSignIn zu jeder API vor Rufen Sie Ihren Anwendungsserver an.

Ich versuche, ein neues Token durch Aufruf von SilentSignIn zu erhalten. Aber ich bekomme immer den gleichen abgelaufenen ID-Token. Kann mir jemand helfen, auf die richtige Dokumentation hinzuweisen, die zeigt, wie erzwungen wird, um ein neues Token zu erhalten. Mein Code ist nichts besonderes. Es ist fast das Gleiche wie das, was wir in google's Beispiel haben.

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(); 
} 

Ich baue meine API wie oben, und wenn Benutzer klickt auf Login mit Google Schaltfläche ausführen ich die folgende Aktion

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 Verfahren würde die ID-Token als

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

erhalten EDIT 1

Ich habe auch die damit verbundene Frage.

Nachdem ich die Erlaubnis von https://security.google.com/settings/u/1/security/permissions widerrufen hatte, konnte ich immer noch das ID-Token (JWT) abrufen. Angenommen, dieses Token wird zwischengespeichert und von Android Play Services wird es von einer lokalen Kopie bereitgestellt. Nachdem der Token abgelaufen ist (60 Minuten), sollte der Play-Dienst den Google-Dienst kontaktieren, um den neuesten Status zu erhalten. Aber ich sehe das nicht. In der Tat, eine andere seltsame Sache, die ich bemerkt habe, ist, wenn ich SilentSignIn() nach etwa einem Tag oder so aufrufen, bekomme ich ein neues Token ohne Zustimmung des Benutzers. Kann jemand bitte diesen Anwendungsfall testen und mir die Ausgabe mitteilen.

Wie kann ich sicherstellen, dass Benutzer aufgefordert werden, die Erlaubnis erneut zu erteilen, wenn sie es widerrufen haben.

+0

Ich bin nicht genau sicher, wie OptionPendingResult funktioniert, aber haben Sie den Leitfaden hier versucht? https://developers.google.com/identity/sign-in/android/sign-in#start_the_sign-in_flow (Stand: 17. Mai 2016). Dieses Handbuch verwendet 'startActivityForResult()' und 'onActivityResult()', so wie ich meine implementierte und ein nicht abgelaufenes Token abruft. – Vinnie

+0

Oh! Ich habe vergessen, startActivityForResult() Teil hinzuzufügen. Ich habe es auch versucht. Aber das Ergebnis änderte sich nicht. Wie haben Sie ein nicht abgelaufenes Token erhalten? Google gibt nur einen 1-Stunden-Token. hast du das JWT mit etwas ähnlich wie https://jwt.io/ dekodiert? Was ist der "exp" -Epochenwert? –

+0

Ich habe den hier beschriebenen Google Token Endpoint verwendet. https://developers.google.com/identity/sign-in/android/backend-authIch schreibe dies als Lösung auf. – Vinnie

Antwort

1

Sie müssen startActivityForResult() verwenden und dann das Anmeldeergebnis in onActivityResult() behandeln, wie hier erläutert Integrating Google Sign-In into Your Android App. Um die Echtheit des Tokens zu überprüfen, lesen Sie bitte den Google-Leitfaden für Google-Anmeldung für Android unter Authenticate with a backend server.

Eine einfache Möglichkeit besteht darin, das Token an den Google-Tokeninfo-Endpunkt https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123 zu übergeben, wobei XYZ123 Ihr Token ist.