首页 > 解决方案 > Firebase实时数据库android客户端在一小时后检测用户注销

问题描述

我在一个 android 项目中使用 Firebase 实时数据库和 Firebase 电话身份验证,该项目是用 java 开发的。

我已经能够成功地通过电话登录对用户进行身份验证,现在我在数据库助手中设置了一些 ValueEventListeners。然而,大约一小时后(因为 firebase 身份验证令牌过期),我的值甚至监听器回调都没有触发。

我该如何处理这种情况。我想让我的用户保持身份验证,除非他们手动注销。

public void refreshUserAuthToken(){
        try {
            FirebaseUser thisUser = FirebaseAuth.getInstance().getCurrentUser();
            thisUser.getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
                @Override
                public void onComplete(@NonNull Task<GetTokenResult> task) {
                    if (task.isSuccessful()){
                        // nothing
                        // the task is succesful
                    }
                    else {
                        startActivity(new Intent(getApplicationContext(), LoginActivity.class));
                    }
                }
            })
        }
        catch (Exception e){
//            new Intent(MainActivity.class, this)
        }
    }

我应该何时以及如何称呼它?我尝试在登录活动中使用它,但任务总是不成功

我还应该在每次加载活动时调用此函数吗?

我也有应用程序与 Web 服务交互,我该如何利用它?有人可以将我指向一个 git repo 或提供一个代码流来帮助我让我的用户长时间保持登录状态吗?

提前致谢

编辑

我将 getIdToken(true) 更改为 getIdToken(false) 不会导致它总是失败。

这在一定程度上解决了我的目的,但是如果用户将活动/片段打开超过一个小时,我仍然不确定如何以及在哪里调用它。

下一个阶段是我的firebase实时数据库看起来在内部注销,但是如何传递这个新令牌?

一遍又一遍地调用这个函数,如果令牌超时,肯定会把我带到登录页面,但我怎样才能让 firebase 回调保持登录状态?

标签: androidfirebasefirebase-authentication

解决方案


然而,大约一小时后(因为 firebase 身份验证令牌过期),我的值甚至监听器回调都没有触发。

这是完全可以预料的。ID 令牌持续一个小时(出于安全原因),然后 Firebase Auth SDK 将刷新它。您将需要使用该新令牌并在以后的请求中使用它。

您可以通过使用提供的 API 监听更改来了解令牌何时刷新。您将需要使用addIdTokenListener()来注册一个IdTokenListener,只要有更新就会调用它。例如:

FirebaseAuth.getInstance().addIdTokenListener(new FirebaseAuth.IdTokenListener listener() {
    public void onIdTokenChanged (FirebaseAuth auth) {
        // get the new token
        auth.getCurrentUser().getIdToken(false).addOnCompleteListener // and so on...
    }
});

当您不再需要监听器时,请务必移除它。


推荐阅读