我有一个 react 应用程序,我可以使用自定义 token 登录,如下所示:
await firebase.auth().signInWithCustomToken(tokenResp.token);
根据 this ,firebase 自定义 jwt 的有效期为一小时。这正是我所期望的。
但是,当我在 1 小时后调用需要身份验证的集合(即通过 firestore 规则的 request.auth!=null
)时,我可以访问它们。我预计 Firebase 实例会在这些调用一小时后(自动)失败。
那么为什么会发生这种情况以及如何解决它?
另请注意,我已登录用于身份验证的 jwt,通过查看 jwt 解码器中的 exp
字段,可以清楚地看出到期日期是一小时。
最佳答案
当文档指出自定义 token (在您的情况下为 tokenResp.token
)有效期为一小时时,这意味着 signInWithCustomToken
调用必须在 token 创建后一小时内发生。用户“登录”后(使用任何 signInXXX
方法),他们将获得访问 token 和刷新 token ,这些 token 可以无限期地使用,直到注销或撤销为止。
听起来您正在尝试使用安全规则来限制对过去一小时内登录的用户的访问。为此,请检查 auth.token.auth_time
包含用户何时进行身份验证的字段(自纪元以来以秒为单位)。例如:request.time < timestamp.value(auth.token.auth_time * 1000) + duration.time(1, 'h')
计算结果为 true
如果请求时间在登录时间后一小时内。您可以使用它代替 request.auth!=null
.
此外,您可以在一小时后在客户端自动注销用户,例如使用 JavaScript 计时器并检查 (await firebase.auth().currentUser.getIdToken()).auth_time
以及。 (请注意,这仅仅改善了客户端的用户体验,并不能替代安全规则,因为客户端代码不能完全信任。)
关于google-cloud-firestore - 使用自定义身份验证 token 的 Firebase 登录不会在 1 小时后过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72065123/