【发布时间】:2021-04-14 19:23:34
【问题描述】:
每次我需要通过 Retrofit 在 Header 中发送我的 REST 请求时,我都想发送更新的令牌 (FirebaseAuth.getInstance().getAccessToken())。我已将 RetrofitClient 设置如下-
RetrofitClient.java
public class RetrofitClient {
private static final String BASE_URL = "API_URL";
private static RetrofitClient mInstance, mAuthInstance;
private Retrofit retrofit;
private RetrofitClient(boolean requireAuthorization, String firebaseID, Context context){
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//Put Custom Header i.e. 'InterceptorHeader' in all API request
OkHttpClient okHttpClient;
if(requireAuthorization)
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new ConnectivityInterceptor(context)) // Header to check internet connectivity
.addInterceptor(new AuthorizationInterceptorHeader(firebaseID)) // Header Auth InterceptorHeader
.addInterceptor(loggingInterceptor).build(); // Header for logging
else
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new ConnectivityInterceptor(context)) // Header to check internet connectivity
.addInterceptor(new InterceptorHeader()) // Header InterceptorHeader
.addInterceptor(loggingInterceptor).build(); // Header for logging
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient) //adding custom OkHttp Client
.build();
}
public static synchronized RetrofitClient getInstance(Context context){
if(mInstance == null){
mInstance = new RetrofitClient(false, null, context);
}
return mInstance;
}
public static synchronized RetrofitClient getAuthInstance(boolean requireAuthorization, String firebaseID, Context context){
if(mAuthInstance == null){
mAuthInstance = new RetrofitClient(requireAuthorization, firebaseID, context);
}
return mAuthInstance;
}
public TurnoAPI getTurnoApi(){
return retrofit.create(TurnoAPI.class);
}
}
AuthorizationInterceptorHeader.java
public class AuthorizationInterceptorHeader implements Interceptor {
String firebaseID;
public AuthorizationInterceptorHeader(String firebaseID) {
this.firebaseID = firebaseID;
}
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request originalRequest = chain.request();
//TODO change request header
Request newRequest = originalRequest.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("api-key", "api_key")
.addHeader("api-hash", "api_key")
.addHeader("**Authorization**", "FIREBASE_TOKEN")
.build();
return chain.proceed(newRequest);
}
}
我想在标题中发送 FirebaseAuth.getInstance().getCurrentUser().getIdToken() 说 Authorization。现在因为 getIdToken() 正在返回一个任务,所以我不确定我需要如何设置以使用更新的 Firebase 令牌发出每个身份验证请求,任何解决方法都将不胜感激。谢谢。
【问题讨论】:
-
也许this 可以帮助你。还有official docs
-
@OmGupta 是的,这是我们获取令牌的方式,但是如何在每个请求中发送更新的令牌......我不确定
-
更新令牌是什么意思?
-
@OmGupta 更新令牌意味着我需要使用身份验证发送更新的令牌,因为如果我兑现它,令牌将在 1 小时内过期,我会更新它,我需要处理它并获取新令牌/或每次都不会过期的令牌
-
我上面发送的链接已经回答了你的问题。每次调用 getIdToken() 方法时,将 forceRefresh 设为 true 都会为您获取更新的令牌,并且不会为您提供过期或无效的令牌。
标签: android firebase firebase-authentication retrofit2 access-token