2016-07-28 16 views
2

アプリでGoogleのサインインを使用しています。ユーザーがサインインしてIDトークンを取得するとすぐにIDトークンをバックハンドサーバーに送信します。今のところ、IDトークンを各HTTP要求のヘッダーに追加して検証し、ユーザーのIDを取得し、データをアプリケーションに返信します。 IDトークンを永続的に保存し、今後のすべての要求に使用することができれば、私は疑問に思っています。 IDトークンが変更されるか、しばらく時間切れになりますか?もしそうなら、新しいIDトークンを取得する方法は?ユーザーに再度サインインするように求める以外の方法はありません。または、IDトークンを1回だけ検証し、将来の要求でIDを直接使用する必要がありますか?GoogleトークンにIDトークンを永続的に保存する必要がありますか?

答えて

2

IDトークンは保存しないでください。 Google IDトークンは有効期限1時間で発行され、有効期限が切れます。アプリでsilentSignInを使用するだけで、ユーザーの操作なしで新しいIDトークンを取得できます。既存のトークンがまだ有効期限切れでない場合は、(キャッシュされた)バージョンが返されます(OptionalPendingResultが返されます)。isDone() == trueが返されます。既に有効期限が切れている場合は、最新のものを取得します(ただし、少し時間がかかるため、OptionalPendingResult isDone()falseになります)。ここで

は(UIスレッド、ワーカースレッドについては、以下の注を参照)sample codeです:

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

関連する問題