【发布时间】:2016-12-22 06:49:41
【问题描述】:
我目前使用firebase.auth().createUserWithEmailAndPassword(email, password) 对用户进行身份验证,并使用来自firebase.auth().currentUser.getToken(true) 的JWT 令牌进行API 请求。但是,Firebase 会在 1 小时后使令牌失效。所以我想知道我应该如何刷新令牌。我是否必须使用自己的自定义令牌生成来正确利用令牌刷新?
虽然我只测试过一次,但我目前正在使用它,但它似乎可以工作。
firebase.auth().onAuthStateChanged(function () { // Refresh token here })
我一遍又一遍地阅读文档,没有看到任何关于刷新 Web 应用程序令牌的内容。我还查看了 firebase 的示例存储库,并没有看到有人使用 onAuthStateChanged 来做类似的事情。所以我想知道这是客户端令牌刷新的正确方法吗?我觉得这可能不是最好的方法的原因是因为这可能有一个竞争条件。例如,如果令牌过期并且我在刷新令牌之前使用旧令牌发送 API 请求,那么我的 API 请求将出现令牌过期的身份验证失败。
这与Firebase DB HTTP API Auth: When and how to refresh JWT token? 中的问题非常相似,但在问题是关于使用Python 并且没有提及onAuthStateChanged 的意义上略有不同。
谢谢!
【问题讨论】:
-
通常,如果令牌过期,您必须调用 firebase.auth().currentUser.getToken() 来获取新令牌。每次您调用它时,它都会负责将新令牌返回给您。 Firebase id 令牌是敏感数据,您应该小心传递它们的方式。
-
@bojeil 是的,这就是我正在做的事情,但我试图找出令牌何时过期,以便我可以刷新令牌。因为我在文档中没有看到有关如何检查令牌何时过期的任何内容。我想验证上面是否有更好的方法,或者我是否应该在每个似乎不是最佳的 API 请求之前始终刷新令牌
-
getToken 在内部检查令牌是否过期并刷新它并返回一个新令牌。令牌持续一个小时。
-
所以你建议我这样做? using setTimeout(function() { // 刷新令牌 }, 60 * 60 * 1000); (可能是每 50 分钟而不是 60 分钟刷新一次)但是我不确定在代码/令牌中没有明确提及令牌持续一小时的情况下刷新令牌的感觉如何.如果 Firebase 将令牌更改为在不同的时间而不是 1 小时过期,这在技术上会中断。
-
从后端服务器返回token时,也会同时返回过期时间。图书馆将对此进行跟踪。如果超过过期时间,它会调用后端新的。如果通过传递 true 强制刷新,它将向后端发送请求。否则,令牌被缓存并返回而不查询后端。
标签: javascript firebase firebase-authentication