在我的服务器上,我看到这些错误时,使用firebase管理sdk .verifyIdToken()
Firebase ID令牌已过期。从客户端应用程序获取新令牌,然后重试
Firebase ID令牌具有与已知公钥不对应的“kid”声明。ID令牌很可能已过期,因此请从您的客户端应用获取新令牌,然后重试。有关如何检索ID令牌的详细信息,请参阅https://firebase.google.com/docs/auth/admin/verify-id-tokens。
在客户端,我在浏览器<>服务器之间的每个请求之前这样做:
firebase.auth().currentUser.getIdToken()
字符串
我从阅读文档中了解到,这个函数将获得一个有效的,未过期的令牌,因为后台的SDK将根据需要刷新自己。可选地,我可以将true
传入此函数以强制刷新。
为什么这个getIdToken()
函数似乎在向我的后端发送过期的令牌?
看来要解决这个问题,我的选择是:
1.传入true
以在每次调用getIdToken()时强制刷新。这是不必要的昂贵,因为它会在来自浏览器<>我的服务器的请求之前,增加来自浏览器<> Firebase的整个往返网络请求的开销
1.以我现在的方式调用getIdToken()
-在客户端手动解码令牌,检查过期时间,如果已过期,则再次调用getIdToken(true)
以强制刷新并将新刷新的令牌发送到我的服务器
第2条是解决这个问题的建议/预期方法吗?这里好像有点不对劲……
8条答案
按热度按时间9rygscc11#
令牌通常在一小时后到期。
getIdToken
将在缓存令牌过期时刷新该令牌。确保在需要将令牌发送到服务器时始终在客户机上调用它。如果您缓存令牌并始终将其发送到后端,则它将在某个时候过期。另外,为了以防万一,请确保您的服务器时钟同步。这是不太可能的,但你的时钟可能是出于某种原因不同步。
vyswwuz22#
另一个可能的解决方案上面提到的,是你的浏览器(或系统)日期是错误的。它几乎总是与日期有关。
eagi6jfj3#
字符串
当您的设备时间错误时,您将收到此错误。检查您的设备时钟时间。
e4yzc0pl4#
如果您在后端使用token,则可以执行以下操作:
1.检查后端的令牌
2.如果令牌已过期,发送401未授权。
3.在客户端,检查状态码是否为401未自动化,如果是,调用
getIdToken
并保存新令牌cygmwpex5#
我面临着同样的问题之前和之后的一些尝试和错误,我发现这是由时间同步造成的。
我把我的电脑时间和时区设置为自动,并修复了这个问题。另外,记得在getIdToken(true)中添加“true”
ivqmmu1c6#
尝试使用类似这样的东西:
字符串
t5fffqht7#
您是否注意到有一种获取令牌的异步方式?
字符串
不确定,但我猜它会进行内部检查,如果token不再有效(例如,有一个刷新的token广播为当前用户,它没有到达用户出于某种原因,例如网络问题),它会请求新的token并返回。
我正在做一个关于这个主题的研究,以及,将更新,如果会发现任何新的。
dluptydi8#
const user = firebase.auth().currentUser
const { token } = await user.getIdTokenResult(true)
试试这个。使用这个方法不会使令牌过期