2017-10-30 4 views
1

Firebase ID Tokens을 사용하여 사용자의 HTTP 요청을 인증하고 있습니다. 현재 Firebase ID 토큰을 요청하고 요청 헤더에 요청 인터셉터를 설정했습니다.개조 된 요청 헤더에 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)에서 완벽하게 작동하고 아래에 있지만 SDK (25)와 HTTP 요청을 통해 흐르지 않고, 아무것도, 심지어 logging-interceptor에 기록되지 도착 위에 실행할 때.

아래 코드와 함께이 인터셉터를 사용하고 있습니다.

public Retrofit getRetrofit() { 
    return new Retrofit.Builder() 
      .baseUrl(baseUrl) 
      .client(getOKHttpBuilder().build()) 
      .addConverterFactory(converter) 
      .build(); 
} 

내가 .client(getOKHttpBuilder().build())를 제거하고 .client(new OkHttpClient.Builder().build()) 모든 것이 잘 작동로 교체합니다.

+0

"SDK 25 이상에서 작동하지 않음"이란 의미를 정확히 설명 할 수 있습니까? 오류가 발생합니까? 스택 트레이스가 있습니까? getNewTokenPassively() 함수가 올바른 값을 반환하지 않거나 전혀 반환하지 않습니까? 다른 일이 발생하거나 발생하지 않습니까? –

+0

질문을 편집하여 자세한 정보를 추가했습니다. –

답변

0

이유는 getNewTokenPassively() 함수 내에 비동기식 onComplete 호출이 있기 때문입니다. 요청 헤더에 추가하기 전에 토큰을 가져와야합니다.

+0

그게 내가 'while loop'을 가지고있는 이유 다. –