android - 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 回调保持登录状态?
解决方案
然而,大约一小时后(因为 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...
}
});
当您不再需要监听器时,请务必移除它。
推荐阅读
- css - 图像旋转 180 度?
- python - 生成带有循环值的文本文件
- regex - RegEx - 在整个字符串中查找多个破折号......还有更多
- flutter -
我不小心删除了IDE中灯泡中带有×××选项的包装。我在哪里可以重新启用这些选项? - javascript - 更新到数据库后返回更新的对象而不是计数
- elixir - 对 pin (^) 运算符的使用感到困惑
- python - tesserocr 获取每个单词的方向
- apache - 只允许从 localhost 访问 phpmyadmin
- ruby-on-rails-4 - 当终端中的相同启动命令有效时,无法在 debian 上使用 systemd 运行 puma(fe_sendauth:未提供密码错误)
- lightgbm - LightGBM '在数据集中使用 categorical_feature。警告?