firebase 访问令牌是不是会自动刷新?
Posted
技术标签:
【中文标题】firebase 访问令牌是不是会自动刷新?【英文标题】: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
被触发。但这不是我想要的。
【问题讨论】:
【参考方案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)需要持久连接,因此它们需要不断地这样做。否则会出现断开连接。以上是关于firebase 访问令牌是不是会自动刷新?的主要内容,如果未能解决你的问题,请参考以下文章