错误:Firebase ID令牌已过期

dyl*_*jha 21 firebase firebase-authentication

在我的服务器上,我在使用firebase admin sdk时看到了这些错误 .verifyIdToken()

Firebase ID令牌已过期.从您的客户端应用中获取新的令牌,然后重试

Firebase ID令牌具有"kid"声明,该声明与已知的公钥不对应.很可能ID令牌已过期,因此请从您的客户端应用获取新令牌,然后重试.有关如何检索ID令牌的详细信息,请参阅https://firebase.google.com/docs/auth/admin/verify-id-tokens.

在客户端,我在浏览器<>服务器之间的每个请求之前执行此操作:

firebase.auth().currentUser.getIdToken()
Run Code Online (Sandbox Code Playgroud)

通过阅读文档,我的理解是此函数将获得有效的,未过期的令牌,因为后台的SDK将根据需要自行刷新.或者,我可以传入true此功能以强制刷新.

为什么这个getIdToken()函数似乎是将过期的令牌发送到我的后端?

似乎要解决这个问题我的选择是:

  1. 传入true强制刷新每次我打电话getIdToken时间().这是不必要的昂贵,因为它会在来自浏览器<>我的服务器的请求之前从浏览器<> firebase添加整个往返网络请求的开销
  2. 调用getIdToken()我现在的方式 - 在客户端手动解码令牌,检查到期,如果它已过期然后getIdToken(true)再次调用强制刷新并将新刷新的令牌发送到我的服务器

2号是推荐/预期的处理方式吗?看来这里有些不对劲......

boj*_*eil 11

令牌通常在一小时后到期.getIdToken将刷新缓存的令牌(如果已过期).当您需要将令牌发送到服务器时,请确保始终在客户端上调用该号码.如果您缓存令牌并始终将其发送到您的后端,它将在某个时候到期.

同样,以防万一,确保您的服务器时钟同步.由于某种原因,你的时钟可能不同步.

  • 你从哪里得知刷新需要10秒?这没有事实依据。使用短期代币可以最大限度地减少攻击窗口,并且是一个完善的行业标准。 (4认同)
  • 但这里的问题是,firebase 是一个好的设计吗?拥有一个每小时过期的令牌并且必须在将其发送到后端服务器之前刷新,这似乎是 IMO 一个糟糕的设计。我已经看到 getIdToken() 调用最多需要 10 秒才能返回,因此让用户等待 10 秒是非常糟糕的用户体验。我觉得我必须在这里遗漏一些东西? (2认同)

isu*_*uru 9

Error: Firebase ID token has expired
Run Code Online (Sandbox Code Playgroud)

当您的设备时间错误时,您会收到此错误。还要检查您的设备时钟时间。


Mar*_*one 7

上面提到的另一个可能的解决方案是您的浏览器(或系统)日期错误。它几乎总是与日期有关。