如何处理 Firebase 中过期的用户 ID 令牌?

Posted

技术标签:

【中文标题】如何处理 Firebase 中过期的用户 ID 令牌?【英文标题】:How to handle expired user ID token in firebase? 【发布时间】:2021-08-03 21:18:11 【问题描述】:

我正在使用 Firebase 身份验证来对用户进行身份验证。每当用户登录时,我都会使用user.getIdToken(true) 获取用户的 ID 令牌并将其设置在本地存储上。使用授权标头中的该令牌,我正在请求我的后端 API。

在后端,我使用 Firebase 管理 SDK 来验证请求,并使用请求授权标头中传递的客户端 ID 令牌对用户进行身份验证。

这工作了一段时间。但过了一段时间我得到错误:

ExpiredIdTokenError: 令牌过期,1620908095

我看到 Firebase 会自行刷新 ID 令牌。但我认为情况并非如此。我查看了开发人员工具网络选项卡,还有一个观察者方法可以检查令牌何时更改 => onIdTokenChanged(),但令牌永远不会刷新。

我也找不到有关 Firebase 文档的任何信息,希望您能帮助我:

如何生成一个没有过期限制的令牌,以持续到注销或至少持续一段时间(可能是 1 周)? 如果我无法设置令牌的过期限制,我应该采取哪些步骤以便在我从后端请求数据时发送有效的未过期令牌?在我从后端 API 请求之前,我是否必须每次都调用 user.getIdToken(true) 并获取一个新的令牌?

【问题讨论】:

第一颗子弹,见:firebase.google.com/docs/auth/admin/manage-cookies 【参考方案1】:

idTokenChanged() 观察者有点误导。它会在刷新令牌时触发,但只有在您还使用其他 Firebase 产品(如其数据库或文件存储)时才会自动刷新令牌。在其他情况下,正如您所说,您应该调用user.getIdToken(),它会在您每次调用 API 时在必要时为您刷新过期令牌。您不需要将true 传递到此方法中,除非您希望每次 都获得一个全新的令牌(您很可能不需要)。

据我所知,您无法控制使用客户端 SDK 生成的令牌的过期时间,因为您需要在服务器上生成自己的令牌。

【讨论】:

firebaser here 登录用户的 ID 令牌 会自动刷新,并在发生这种情况时调用 ID 令牌更改的侦听器。 我的理解是,如果您将实时数据库或 Firestore 与 Firebase 身份验证结合使用,它只会主动刷新令牌。这种行为是否记录在某处?似乎并不只有我有这种印象:***.com/a/49697718/1386873 啊,我不知道,但是bojeil绝对是这方面的权威。我总是至少使用其他 Firebase 服务之一,所以这可以解释为什么我从来没有得到过期的令牌。如果 OP 没有,他们可能确实必须在这种情况下强制刷新令牌。我建议不要对每次调用都这样做,而是将 ID 令牌缓存一段时间,类似于 Firebase SDK 所做的。 是的。我认为这可以更好地记录下来。感谢您的编辑! 我可能会在每次请求之前致电getIdToken

以上是关于如何处理 Firebase 中过期的用户 ID 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 firebase 动态链接的生命周期? (iOS)

firebase、flutter应该如何处理好友请求和邀请? [关闭]

Firebase Unity:如何处理没有互联网连接的情况

Firebase 和 VueJS:如何处理使用 Google 登录但未在我的应用中注册的用户?用户资料管理

Firebase Auth UI 如何处理重新身份验证?

FBSDK令牌过期情况如何处理?