【问题标题】:Is the firebase access token refreshed automatically?firebase 访问令牌是否会自动刷新?
【发布时间】:2018-09-14 08:08:22
【问题描述】:

我正在使用 Firebase 电子邮件/密码身份验证。 用户成功登录后,我通过以下方式查询访问令牌:

FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
    .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
    public void onComplete(@NonNull Task<GetTokenResult> task) {
        if (task.isSuccessful()) {
            String idToken = task.getResult().getToken();
            // Send token to your backend via HTTPS
            // ...
        } else {
            // Handle error -> task.getException();
        }
    }
});

根据 Firebase 文档,访问令牌会在 1 小时后过期。为了处理在我的应用程序中始终拥有当前访问令牌的情况,我一直在寻找解决方案,我在 firebase 文档中发现我有 to register a Firebase.IdTokenListener 来收听

onIdTokenChanged 事件

我的问题是:是

onIdTokenChanged 事件

如果访问令牌过期自动触发?

如果访问令牌过期后未自动触发事件,使用

"FirebaseAuth.getInstance().getCurrentUser().getIdToken(boolean)"

方法?

我知道,如果我打电话给

mUser.getToken(true)

然后提到的事件被触发并且

IdTokenListener

被触发。但这不是我想要的。

【问题讨论】:

    标签: java android firebase firebase-authentication


    【解决方案1】:

    onIdTokenChanged 会在 ID 令牌更改时触发。如果 ID 令牌过期,它不会触发。如果刷新新 ID 令牌、新用户登录或现有用户退出,它将触发。

    Firebase 会在需要时自动刷新。例如,如果您使用的是实时数据库或 Firestore,它们将在令牌过期后自动刷新令牌,因为它们需要持久连接和 ID 令牌。这将导致该侦听器触发。

    getIdToken() 将缓存未过期的令牌,如果您调用它并检测到过期,它将自动刷新 ID 令牌,这将触发该侦听器。

    顺便说一句,getToken() 已弃用。你应该改用getIdToken

    【讨论】:

    • 这是否意味着必须定期调用 getIdToken() 以隐式“检查”令牌是否已更改?我假设底层 Firebase SDK 在过期后触发 onIdTokenChanged 事件,这样我只需调用我的 onIdTokenChanged 事件监听器 getIdToken()乙>。这对我来说意味着,我必须在每个后端 API 请求 getIdToken() 之前调用,以确保拥有最新的 id 令牌。好像有点开销...
    • 您不需要定期调用,您只需在向服务器发出请求时调用它即可。它将确保您每次都获得一个新的 ID 令牌。
    • “例如,如果您使用的是实时数据库或 Firestore,它们会在令牌过期后自动刷新令牌,因为它们需要持久连接和 ID 令牌。”该声明有参考链接吗?
    • 你可以测试一下。 Auth 服务本身不会主动刷新(因为这是一项昂贵的操作,如果没有新令牌的消费者,则可能没有必要)。其他 firebase 服务(实时数据库、firestore)需要持久连接,因此它们需要不断地这样做。否则会出现断开连接。
    猜你喜欢
    • 2018-08-17
    • 2015-10-05
    • 1970-01-01
    • 2021-02-22
    • 2017-05-16
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多