2017-10-30 4 views
1

Firebase ID Tokensを使用して、ユーザーからのHTTP要求を承認しています。現在、私は、Firebase IDトークンを要求し、それをリクエストヘッダに追加するリクエストインターセプタを設定しています。 SDK 25上で動作し、HTTPリクエストが流れていないと何もさえlogging-interceptorログオンしていない上に取得したときに改造したリクエストヘッダーにFirebase IDトークン(認証トークンではない)を送信する

private OkHttpClient.Builder getOKHttpBuilder() { 
    OkHttpClient.Builder builder = new OkHttpClient.Builder(); 

    builder.addInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 

      Request.Builder newRequest = request.newBuilder().header("x-access-token", getNewTokenPassively()); 
      return chain.proceed(newRequest.build()); 
     } 
    }); 

    return builder; 
} 

private String getNewTokenPassively() { 
    FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); 

    final String[] currentToken = {null}; 

    if(currentUser != null) { 
     currentUser.getIdToken(false).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { 
      @Override 
      public void onComplete(@NonNull Task<GetTokenResult> task) { 
       try { 
        currentToken[0] = task.getResult().getToken(); 
       } 
       catch (Exception e) { 
        //TODO: Investigate 
       } 
      } 
     }); 
    } 

    while(currentToken[0] == null) { 
     //do nothing 
    } 

    return currentToken[0]; 
} 

このコードは、SDK 24に上下に完璧に動作しますが。

私はこのインターセプタを以下のコードで使用しています。

​​

私は.client(getOKHttpBuilder().build())を削除し、.client(new OkHttpClient.Builder().build())すべてが正常に動作して、それを交換してください。

+0

「SDK 25以上で動作しない」という意味を明確にすることはできますか?エラーになりますか?スタックトレースはありますか? getNewTokenPassively()関数は適切な値を返さないか、まったく返さないのでしょうか?何か他のことが起こるかどうか? –

+0

質問を編集して詳細を追加しました。 –

答えて

0

理由は、getNewTokenPassively()関数内に非同期のonComplete呼び出しがあるからです。 トークンをリクエストヘッダーに追加する前にトークンを取得する必要があります。

+0

私が知っているのは、それが私が「whileループ」を持っている理由です... –

関連する問題