我正在使用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())
,一切正常。
答案 0 :(得分:0)
原因是你的getNewTokenPassively()函数里面有一个异步的onComplete调用。 在将其添加到请求标头之前,您需要获取令牌。