2017-01-11 1 views
12

自分のREST APIサーバーからデータを消費するAndroidアプリを開発しています。 Firebase認証を使用したいのは、ユーザーがGoogle、Facebook、Twitter ...を使って簡単にログインできるようにするためです。AndroidアプリでIDトークンを取得し、バックエンドサーバーで確認する(IDトークンの使い方?)

しかし、私はIDトークンを使用するかどうかはわかりません:IDトークンは有効期限がありますので

  • が、私はクライアントアプリ内のすべてのリクエストに応じて入手トークンメソッドを呼び出す必要がありますが、私は私は確信しています毎回有効なトークンを送信しますか?
  • クライアントアプリケーションからリクエストを受け取るたびにverifyIdTokenをサーバーで呼び出す必要がありますか?

私はこれらのメソッド(入手トークンとverifyIdToken)はボンネットの下に何をすべきか分からない、と彼らは非同期であるので、私は彼らがすべての呼び出し上のサーバーをFirebaseする要求を行っている恐れています。だから、私の要求ごとにFirebaseサーバに2つのリクエストを出すのは方法ではないと思います...

答えて

10

どちらも入手トークン()とVerifyIdToken()はすべての着信/発信要求のために呼ばれるように設計されています。

1)getToken()は非同期ですが、Firebase Android SDKは実際には現在のFirebaseユーザトークンをローカルストレージにキャッシュします。キャッシュされたトークンがまだ有効である限り(すなわち発行されてから1時間以内)、getToken()はトークンを直ちに返します。キャッシングされたトークンが期限切れになったときのみ、SDKはリモートのFirebaseサーバから新しいトークンを取得します。

2)VerifyIdToken()もパフォーマンスを最適化します。ローカルマシン上のトークンシグネチャを検証するために使用されるFirebaseトークン公開証明書(6時間有効)をキャッシュします。パブリック証明書をダウンロードする以外はRPCは関係ありません。

+0

getToken()は現在推奨されておらず、getIdToken()を使用してください。 – TheeBen

+1

'OKHttp.Intercept'でこれを行うと、コードが本当に醜いものになります。 –

-1

以下のコードをアプリケーションクラスで使用し、regIdはデバイストークンの所有者です。

private void checkPlayService() { 
    // Check device for Play Services APK. If check succeeds, proceed with 
    // GCM registration. 
    if (checkPlayServices()) { 
    GoogleCloudMessaging googleCloudMessaging = GoogleCloudMessaging.getInstance(activity); 
     regId = getRegistrationId(); 

     if (TextUtils.isEmpty(regId)) { 
      registerInBackground(); 
     } 
    } else { 
     Log.i(TAG, "No valid Google Play Services APK found."); 
    } 
} 

private String getRegistrationId() { 
    String registrationId = sp.getString(Consts.PROPERTY_REG_ID, ""); 
    if (TextUtils.isEmpty(registrationId)) { 
     Log.i(TAG, "Registration not found."); 
     return ""; 
    } 
    // Check if app was updated; if so, it must clear the registration ID 
    // since the existing regID is not guaranteed to work with the new 
    // app version. 
    int registeredVersion = sp.getInt(PROPERTY_APP_VERSION,0); 
    int currentVersion = getAppVersion(); 
    if (registeredVersion != currentVersion) { 
     Log.i(TAG, "App version changed."); 
     return ""; 
    } 
    return registrationId; 
} 

private void registerInBackground() { 
    new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      String msg = ""; 
      try { 
       if (googleCloudMessaging == null) { 
        googleCloudMessaging = GoogleCloudMessaging.getInstance(activity); 
       } 

       regId = googleCloudMessaging.register(Consts.PROJECT_NUMBER); 
       msg = "Device registered, registration ID=" + regId; 
       Log.e("GCMID",msg); 
       storeRegistrationId(regId); 

      } catch (IOException ex) { 
       msg = "Error :" + ex.getMessage(); 
      } 
      return msg; 
     } 

     @Override 
     protected void onPostExecute(String msg) { 
      Log.i(TAG, msg + "\n"); 
     } 
    }.execute(null, null, null); 
} 



private void storeRegistrationId(String regId) { 
    int appVersion = getAppVersion(); 
    Log.i(TAG, "Saving regId on app version " + appVersion); 
    sp.edit().putString(Consts.PROPERTY_REG_ID, regId).commit(); 
    sp.edit().putInt(PROPERTY_APP_VERSION, appVersion).commit(); 
} 
+0

ありがとうございました。しかし、これは私が求めていることではありません。 GCMサーバーにデバイスを登録することについて話しています。 Firebase Auth IDトークンの使用について質問しています。 –

+0

ああ、私は間違っていた...私の答えは申し訳ありません。 –

7

あなたはリフレッシュ有効これ以上あるたびにトークン。はい、毎回サーバー側のトークンを確認する必要があります。もしそれ以上有効でなければ、あなたはエラーメッセージと共に401エラーコードを送ります(あなたが望むならば)。検証トークンは、トークンを更新するときに使用され、トークンは各要求に追加されます。 OkHttpを使用すると、各リクエストにヘッダのトークンを追加するインターセプタを作成し、エラーコードが401のときにトークンを更新することができます。

+0

あなたの答えをありがとう。あなたは私の疑問を解決しました。 –

1

質問で説明したことから、クロスクライアントあなたはIDトークンを一度入手し、その後の各API呼び出しで取得することなくそれを使用することに興味があるようです。

これは、多かれ少なかれオフラインアクセスメカニズムと同義です。 オフラインアクセスでは、クライアントIe. Androidアプリは要求されたスコープに対するユーザー認証を求めます。認証時に、アクセストークンを発行する代わりに、認証サーバーはアクセストークンとリフレッシュトークンを生成するために使用できる短命の認証コードを返します。

クライアントは、認証コードを安全な接続を介してバックエンドに渡すことができます。バックエンドサーバーは、作成者トークンとリフレッシュトークンを取得して安全な場所に格納することができます。アクセストークンは短期間存続し、短期間にスコープされたリソースにアクセスし、リフレッシュトークンを使用して随時リフレッシュするために使用することができます。リフレッシュトークンは期限切れではなく、取り消すことができます。取り消された場合、サーバーアプリケーションはクライアントアプリケーションにオーサーコードを再フェッチするように要求する必要があります。

クライアントとサーバアプリケーションの両方によって従うべき手順と一緒に完全なインフラストラクチャを詳述され、このリンクを経由してください - https://developers.google.com/identity/protocols/CrossClientAuth

今、あなたの質問に来て、あなたが得ることが若干異なるAPIを使用する必要があります認証コード。このAPIをチェックアウト - で https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder.html#requestServerAuthCode(java.lang.String)

サンプルコード - https://developers.google.com/identity/sign-in/android/offline-access

2
POST https://YOUR_AUTH0_DOMAIN/delegation 
Content-Type: 'application/json' 
{ 
    "client_id":  "YOUR_CLIENT_ID", 
    "grant_type":  "urn:ietf:params:oauth:grant-type:jwt-bearer", 
    "refresh_token": "your_refresh_token", 
    "api_type":  "app" 
} 
関連する問題