在Android应用上处理Firebase IdToken到期

时间:2017-09-16 13:13:12

标签: firebase firebase-authentication

截至目前,

获得了Firebase IDToken

FirebaseAuth.getInstance().getCurrentUser().getIdToken(true)...

每小时到期。我正在使用此令牌来验证对我的后端系统进行的REST调用[{3}}。

目前,每当我的API确认令牌已过期时,我都会有OKHttp interceptor来刷新令牌。这看起来很丑陋而效率低下。

有更好的方法吗?

我使用here作为参考来实现此功能。

2 个答案:

答案 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());
                        }
                    }
                });
            }
        }
    }

希望这有帮助!