1 小时后身份验证令牌无效 - Firebase 中的磁盘持久性

Posted

技术标签:

【中文标题】1 小时后身份验证令牌无效 - Firebase 中的磁盘持久性【英文标题】:Invalid authentication token after 1 hour - Disk Persistence in Firebase 【发布时间】:2016-11-27 10:41:05 【问题描述】:

我正在使用Firebase UI Auth 在我的应用程序中处理电子邮件登录,并启用了磁盘持久性,以便可以离线访问数据。但在应用程序中登录一个小时后,我在 logcat 中收到此警告。

W/PersistentConnection: pc_0 - Auth token revoked: expired_token (Auth token is expired.)
W/PersistentConnection: pc_0 - Authentication failed: invalid_token (Invalid claim 'kid' in auth header.)
W/PersistentConnection: pc_0 - Authentication failed: invalid_token (Invalid claim 'kid' in auth header.)
... repeatedly
... and sometimes
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.

当我收到此消息时,除非我退出/清除数据然后重新登录,否则该应用无法执行任何 Firebase 保存/检索新的未缓存数据操作。然后问题在登录后大约一个小时后再次发生。我遵循了这个token refresh troubleshooting guide(将我的调试和生产密钥 SHA1 添加到 Firebase 和 Google API 控制台)并且它没有解决这个问题。我在我的项目中使用了来自 Firebase 控制台的最新 google-services.json

我也已经在使用最新的 Firebase SDK 和 Play Services 库

compile 'com.google.android.gms:play-services-auth:9.2.1'
compile 'com.google.firebase:firebase-core:9.2.1'
compile 'com.google.firebase:firebase-database:9.2.1'
compile 'com.google.firebase:firebase-auth:9.2.1'
compile 'com.firebaseui:firebase-ui-auth:0.4.3'

我在Application 类中启用了持久性。

public class Application extends android.app.Application 
    @Override
    public void onCreate() 
        super.onCreate();
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    

有什么想法吗?如果您需要更多说明或我没有提供足够的信息,请随时发表评论。 谢谢

【问题讨论】:

这有点远,但您可以检查设备上的日期/时间以确保设置正确吗?如果您的设备时间设置不正确,有时可能会出现与令牌相关的问题。 它设置为“自动”,所以它应该是正确的(基于互联网时间)。我不知道这是否与 firebase-ui 库有关。感谢您的评论,我可以尝试任何其他解决方案吗? :) 用户登录后,能否通过调用FirebaseUser.GetToken(true)获取最新的Firebase Auth token,并在token header中打印出'kid'? Firebase 身份验证令牌是 Json Web 令牌 (JWT),您可以使用 jwt.io 查看 JWT 中的字段。 嗨@JinLiu,令牌标头中的“孩子”是22fb7e6f95c657f4407e04e97c984bb6dbbcfeb3 我想我必须这么说,我有两个应用程序使用同一个 firebase 项目。在两个应用程序中调用getToken() 后,我发现它们的令牌是相同的,即使它们都使用不同的帐户登录。我试过FirebaseUser.getEmail(),两个应用的输出都不一样。 【参考方案1】:

Firebase 服务器无法识别孩子 22fb7e6f95c657f4407e04e97c984bb6dbbcfeb3。如果帐户电子邮件不同,getToken() 肯定会返回不同的令牌。请向 Firebase 提交票证,包括来自您的两个应用的整个令牌负载。

【讨论】:

好的,我会再做一次测试,如果问题仍然存在,我会向 Firebase 支持提交一张票。谢谢!【参考方案2】:

在 Firebase 3 中,JWT 的最长生命周期60 分钟。因此 1 小时后,您将不得不重新生成访问令牌。至于无效声明“kid”,您不需要将任何 kid 有效负载传递给您的 JWT。

注意:您面临的问题是由于最近对 JWT 结构和工作流程所做的更改。我也遇到了同样的问题——我根据新的 JWT 规范修改了我的代码,一切都开始起作用了。

【讨论】:

嗨,感谢您的回复 :) 我没有对 JWT 做任何事情,因为我使用 Firebase SDK 和库 (Firebase-UI) 来处理身份验证部分。仅当我将两个应用程序都安装到设备并登录两个应用程序时,才出现此问题。现在问题不存在了,可能是因为我将 SDK 更新到了 9.4.0。

以上是关于1 小时后身份验证令牌无效 - Firebase 中的磁盘持久性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 刷新令牌保持用户身份验证?

Firebase 令牌在 1 小时内过期后如何保留用户?

使用 Firebase 身份验证进行身份验证后检索 Google 访问令牌

Firebase - 一小时后丢失身份验证会话

摘要身份验证令牌在一段时间后无效

在 Flutter 中使用 Firebase 电话身份验证超时后使 OTP 无效