2016-05-21 38 views
8

Secondo https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInApi.html#constant-summaryGoogle restituisce sempre gettone id scaduto (JWT)

Se si utilizza l'ID del token tempo di scadenza per determinare la durata della sessione, si dovrebbe recuperare un token ID rinfrescata, chiamando silentSignIn prima di ogni API chiama al tuo server delle applicazioni.

Sto cercando di ottenere un nuovo token chiamando silentSignIn. Ma, ottengo sempre lo stesso token ID scaduto. Qualcuno può aiutarmi a segnalare la documentazione giusta che mostra come forzare l'aggiornamento per ottenere un nuovo token. Il mio codice non è niente di speciale. È quasi uguale a quello che abbiamo nell'esempio di 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(); 
} 

io edificherò la mia API come sopra e quando l'utente fa clic su di accesso con il tasto google eseguo la seguente azione

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

metodo handleSignInResult otterrebbe il token ID come

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

EDIT 1

Ho ano domanda correlata.

Dopo aver revocato l'autorizzazione da https://security.google.com/settings/u/1/security/permissions, ero ancora in grado di recuperare il token ID (JWT). Supponiamo che questo token sia memorizzato nella cache e che i servizi di riproduzione Android lo forniscano da una copia locale. Dopo la scadenza del token (60 minuti), il servizio di riproduzione deve contattare il servizio di Google per ottenere lo stato più recente. Ma non vedo che questo accada. In effetti, un'altra cosa strana che ho notato è quando chiamo silentSignIn() dopo circa un giorno, ottengo un nuovo token senza il consenso dell'utente. Qualcuno può testare questo caso d'uso e fammi sapere l'output.

Come posso assicurarmi che gli utenti siano invitati a dare nuovamente il permesso quando lo hanno revocato.

+0

Non sono esattamente sicuro di come funziona OptionalPendingResult, ma hai provato la guida qui? https://developers.google.com/identity/sign-in/android/sign-in#start_the_sign-in_flow (aggiornato fino al 17 maggio 2016). Questa guida usa 'startActivityForResult()' e 'onActivityResult()', che è il modo in cui ho implementato il mio e recupera un token non scaduto. – Vinnie

+0

Oh! Ho dimenticato di aggiungere la parte startActivityForResult(). Ho provato anche con questo. ma non c'era alcun cambiamento nel risultato. Come hai ottenuto un token non scaduto? google dà solo un token di 1 ora. hai decodificato il JWT con qualcosa di simile a https://jwt.io/? qual è il valore di epoca "exp"? –

+0

Ho usato l'endpoint del token di Google descritto qui. https://developers.google.com/identity/sign-in/android/backend-authI scriverò come soluzione. – Vinnie

risposta

1

È necessario utilizzare startActivityForResult(), quindi gestire il risultato di accesso in onActivityResult(), come spiegato qui Integrating Google Sign-In into Your Android App. Quindi, per verificare l'autenticità del token, consulta la guida di Google per l'accesso a Google per Android su come Authenticate with a backend server.

Un modo semplice è passare il token all'endpoint di Google tokeninfo https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123 dove XYZ123 è il token.

Problemi correlati