首页 > 解决方案 > 与 Date.now() 相比,来自 firebase 的解码令牌的到期日期

问题描述

我正在使用jwtDecode包来解码 firebase 刷新令牌,所以我得到一个像这样的对象:

aud: "app name"
auth_time: 1596323784
email: "any email"
email_verified: false
exp: 1596327384
firebase: {identities: {…}, sign_in_provider: "password"}
iat: 1596323784
iss: "https://securetoken.google.com/app name"
user_id: "8mV0nvPuv3ctsZxegS5Sz4uwshP2"

我想总是比较到期日期,Date.now()所以当令牌过期时,用户会重定向到登录页面,但让我感到困惑的是,Date.now()它的价值比exp*1000新令牌更大,

if(decodedToken.exp * 1000 > Date.now()) {
 authenticated = true
} else {
  authenticated = false;
  window.location.href="/login"
}

现在这段代码导致页面每秒重定向到登录页面并且永远不会到达主页,我需要将>更改为<这对我来说是违反直觉的。

在令牌过期之前,到期日期值不应大于Date.now()的返回值

标签: javascriptreactjsfirebasefirebase-authenticationrefresh-token

解决方案


这可能只是一个整数溢出错误 - 尝试这样写:

if(decodedToken.exp  > Math.floor(Date.now() / 1000) {
}

但是,读取令牌的到期时间并不是一个好习惯,因为 API 可能会因为其他原因拒绝令牌,例如撤销和客户端和服务器之间的时钟差异。

这样做效果更好:

  • 当从 API 收到 401 状态时,访问令牌被认为已过期
  • 然后您尝试在授权服务器上刷新访问令牌 - 然后使用新的访问令牌重试 API 调用
  • 最终刷新将失败,在这种情况下授权服务器将返回一个 invalid_grant 错误代码
  • 此错误代码表示会话结束,然后您需要重定向用户重新登录

这是我的一个 React 示例中的一些示例代码,用于比较:


推荐阅读