通过改造在请求标头中发送Firebase ID令牌(非身份验证令牌)

时间:2017-10-30 12:06:14

标签: android firebase firebase-authentication retrofit2

我正在使用Firebase ID Tokens来授权来自用户的HTTP请求。目前我有一个请求拦截器设置,它将请求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()),一切正常。

1 个答案:

答案 0 :(得分:0)

原因是你的getNewTokenPassively()函数里面有一个异步的onComplete调用。 在将其添加到请求标头之前,您需要获取令牌。