2016-07-28 99 views
2

我在我的應用中使用Google登錄功能,一旦用戶登錄並檢索到ID令牌,我就會將ID令牌發送到反手服務器。現在我將ID標記添加到每個HTTP請求的標題中,然後驗證它,獲取用戶標識並將數據回覆給我的應用程序。我想知道是否可以持久存儲ID令牌並將其用於將來的所有請求。 ID令牌會改變或過期一段時間嗎?如果是這樣,如何獲得新的ID令牌?除了要求用戶重新登錄之外,我找不到任何其他方法。或者,我是否應該只驗證一次ID標記並在將來的請求中直接使用ID?我應該在ID登錄中持久存儲ID令牌嗎?

回答

2

不要存儲ID令牌。 Google ID令牌的發佈時間爲一小時有效期,並會過期,您只需在您的應用中使用silentSignIn即可在沒有任何用戶互動的情況下獲取新的令牌。如果您的現有令牌尚未過期,則會返回(緩存)的版本(OptionalPendingResult返回將有isDone() == true);如果它已經過期,你會得到一個刷新的(但它會花一點時間,因此OptionalPendingResult isDone()false)。

這裏是sample code(UI線程,請參閱以下注意有關工作線程):

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

請記住無論你在UI線程或工作者線程中調用silentSignIn。如果你打電話給工作者線程,看看這個帖子blockingConnect() + await(),這簡化了很多代碼: Silent sign in to retrieve token with GoogleApiClient