【发布时间】:2018-05-27 23:03:52
【问题描述】:
在我的服务器上,我在使用 firebase admin sdk .verifyIdToken() 时看到了这些错误
Firebase ID 令牌已过期。从您的客户端应用获取新令牌并重试
Firebase ID 令牌具有与已知公钥不对应的“孩子”声明。 ID 令牌很可能已过期,因此请从您的客户端应用程序获取新令牌并重试。有关如何检索 ID 令牌的详细信息,请参阅 https://firebase.google.com/docs/auth/admin/verify-id-tokens。
在客户端,我在浏览器 服务器之间的每个请求之前执行此操作:
firebase.auth().currentUser.getIdToken()
通过阅读文档,我了解到此函数将获得一个有效的、未过期的令牌,因为后台的 SDK 会根据需要自行刷新。或者,我可以将true 传递给此函数以强制刷新。
为什么这个getIdToken() 函数似乎正在向我的后端发送过期的令牌?
似乎可以解决这个问题,我的选择是:
- 每次调用 getIdToken() 时传入
true以强制刷新。这是不必要的昂贵,因为它会在来自浏览器 我的服务器的请求之前添加来自浏览器 firebase 的整个往返网络请求的开销 - 以我现在的方式调用
getIdToken()- 在客户端手动解码令牌,检查过期时间,如果过期则再次调用getIdToken(true)强制刷新并将新刷新的令牌发送到我的服务器
2 号是推荐/预期的处理方式吗?这里好像有什么问题……
【问题讨论】:
-
您找到解决方案了吗?我看到了类似的症状。
-
@puelo 一样,你能解决它吗?
-
@MartinDeSimone 不。它似乎并不经常发生,所以我没有再看一眼。这可能是由一些时间差异引起的。可能(没有来自 firebase 的任何代码)检查过期没有提供任何缓冲区,因此在某些情况下可能处于边缘。
-
Firebase 将令牌存储在 cookie 中,因此大约一个小时后,令牌就会过期。此时,用户向服务器提交请求(不知道他们有过期的令牌)。服务器读取令牌并尝试验证它,但验证返回“过期”。因此,正如答案所建议的,您需要在每次提交请求之前验证令牌。我不确定为什么 Firebase 文档没有提到这一点。这似乎是一个糟糕的设计。刷新页面将强制客户端上的 javascript 中的 firebase api 再次获取新令牌。
标签: firebase firebase-authentication