【问题标题】:When to refresh expired Firebase3 (Web) Token for API request何时刷新 API 请求的过期 Firebase3 (Web) 令牌
【发布时间】: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


【解决方案1】:

对于那些来到这篇文章寻找答案的人。您可以在所有 API 调用之前获取令牌以获取令牌。

// Make sure you don't pass in true which will always refresh the token
firebase.auth().currentUser.getToken() 

Firebase 将在内部确定令牌是否需要刷新或从缓存中获取。如果您注意到在令牌过期之前 Firebase 不会发送任何网络请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 2020-06-30
    • 1970-01-01
    • 2019-01-30
    • 2015-07-03
    • 2014-10-25
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多