2016-05-21 24 views
8

göre https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInApi.html#constant-summaryGoogle her zaman her API silentSignIn önce arayarak süresi dolmuş id belirteci (JWT)

Eğer oturum ömrünü belirlemek için kimlik belirteci bitiş zamanı kullanırsanız, bir tazelenmiş kimlik kodunu almasına gerektiğini döner uygulama sunucunuzu arayın.

SessizSignIn'ı arayarak yeni bir jeton almaya çalışıyorum. Ancak, her zaman aynı geçerlilik süresi olan kimlik jetonunu alırım. Birisi, yeni bir jeton almak için yenilemeyi nasıl zorlayacağınızı gösteren doğru belgeleri göstermeme yardımcı olabilir. Kodum özel bir şey değil. Google'ın örneğinde sahip olduğumuz neredeyse aynı.

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

google düğmesi ile giriş kullanıcı tıklamaları yukarıda ve zaman olarak benim API inşa ben

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

olarak id jetonu alacağı aşağıdaki eylemi

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 yöntemini gerçekleştirmek EDIT 1

Ano bu konuda ilgili soru.

https://security.google.com/settings/u/1/security/permissions iznini iptal ettikten sonra kimlik belirtecini (JWT) hala alabildim. Bu belirtecin önbelleğe alındığını ve Android oyun hizmetlerinin yerel bir kopyadan sağladığını varsayalım. Jetonun süresi dolduğunda (60 dakika) oyun servisi, en son durumu almak için Google'ın hizmetiyle iletişime geçmelidir. Ama ben bunu görmüyorum. Aslında, dikkatimi çeken bir başka garip şey, bir güne benzediğim zaman sessiz bir şekilde SesiSignIn() dediğimde, kullanıcının rızasıyla yeni bir işaret alır. Birisi bu kullanım durumunu test edebilir ve çıktıyı bana bildirin.

Kullanıcının, iptal edildikten sonra yeniden izin vermesini istediğinden nasıl emin olabilirim?

+0

OptionalPendingResult'un nasıl çalıştığından tam olarak emin değilim, ancak kılavuzu burada denediniz mi? https://developers.google.com/identity/sign-in/android/sign-in#start_the_sign-in_flow (17 Mayıs 2016 itibarıyla güncellenecektir). Bu kılavuz, benim başlattığım ve zaman aşımına uğramamış bir jetonu aldığı "startActivityForResult()" ve "onActivityResult()" işlevini kullanır. – Vinnie

+0

Oh! startActivityForResult() kısmını eklemeyi unuttum. Bunu da denedim. ama sonuçta hiçbir değişiklik yoktu. Süresi dolmamış jetonu nasıl aldınız? google sadece 1 saat jeton verir. JWT'yi https://jwt.io/ ile benzer bir şekilde çözdünüz mü? "exp" çağın değeri nedir? –

+0

Burada açıklanan Google Token Bitiş Noktasını kullandım. https://developers.google.com/identity/sign-in/android/backend-authI bunu bir çözüm olarak yazacaktır. – Vinnie

cevap

1

startActivityForResult() numaralı telefonu kullanmanız ve daha sonra Integrating Google Sign-In into Your Android App burada açıklandığı gibi oturum açma sonucunu onActivityResult() kodunda ele almanız gerekir. Ardından, jetonun gerçekliğini doğrulamak için lütfen Google'ın Android için Google Oturum Açma kılavuzuna bakın ve Authenticate with a backend server.

Basit bir şekilde belirteci, XYZ123'in belirteç olduğu Google tokeninfo bitiş noktası https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123'a iletmektir.