截至目前,
获得了Firebase IDToken
FirebaseAuth.getInstance().getCurrentUser().getIdToken(true)...
每小时到期。我正在使用此令牌来验证对我的后端系统进行的REST调用[{3}}。
目前,每当我的API确认令牌已过期时,我都会有OKHttp interceptor
来刷新令牌。这看起来很丑陋而效率低下。
有更好的方法吗?
我使用here作为参考来实现此功能。
答案 0 :(得分:2)
就像说here一样,并且firebase doc getIdToken(false)
仅在令牌过期时才更新令牌。
答案 1 :(得分:0)
您可以在首选项存储中存储时间戳
如果它为空或从当前时间过去58或59分钟再次获取idToken并在请求标题中将其拍摄,则将当前时间再次存储在首选存储中。
如果它不为空并且从当前时间开始还没有过去58分钟,您可以使用存储在首次调用中的存储idToke。
private void authorizeGet(){
boolean valid = true;
String idToken = PreferenceUtil.getPref(getContext()).getString(PreferenceKeys.ID_TOKEN,"");
long timestamp = PreferenceUtil.getPref(getContext()).getLong(PreferenceKeys.ID_TOKEN_EXPIRATION,-1);
if (idToken.isEmpty()){
valid = false;
}
else{
long diff = timestamp - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
if (diff<100){
valid = false;
}
}
if (valid){
loadData(idToken);
}
else{
if (mAuth.getCurrentUser()!=null){
mAuth.getCurrentUser().getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
@Override
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()){
PreferenceUtil.getPref(getContext()).edit().putString(PreferenceKeys.ID_TOKEN,task.getResult().getToken()).apply();
PreferenceUtil.getPref(getContext()).edit().putLong(PreferenceKeys.ID_TOKEN_EXPIRATION,task.getResult().getExpirationTimestamp()).apply();
loadData(task.getResult().getToken());
}
}
});
}
}
}
希望这有帮助!