Javascript 与date.now()相比,firebase解码令牌的过期日期

Javascript 与date.now()相比,firebase解码令牌的过期日期,javascript,reactjs,firebase,firebase-authentication,refresh-token,Javascript,Reactjs,Firebase,Firebase Authentication,Refresh Token,我正在使用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: &qu

我正在使用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"
}

现在,这段代码会导致页面每秒重定向到登录页面,并且永远无法访问主页,我需要将更改为,这可能只是一个整数溢出错误-请尝试这样编写:

if(decodedToken.exp  > Math.floor(Date.now() / 1000) {
}
不过,读取令牌的到期时间并不是一个好的做法,因为API可能会出于其他原因拒绝令牌,例如撤销和客户端与服务器之间的时钟差异

这样做效果更好:

  • 当从API收到401状态时,访问令牌被视为过期
  • 然后尝试在授权服务器上刷新访问令牌,然后使用新的访问令牌重试API调用
  • 最终刷新将失败,在这种情况下,授权服务器将返回无效的授权错误代码
  • 此错误代码表示会话结束,然后需要重定向用户以再次登录
下面是我的React示例中的一些示例代码,可与之进行比较:


FYI:Firebase Auth SDK会根据需要每小时自动刷新用户的令牌。通常,开发人员允许用户登录任意时间。我很好奇你为什么要尝试做一些不同的事情。@DougStevenson我没有尝试做一些不同的事情,我希望用户保持登录,即使在导航栏中单击登录链接而不是指向登录页面时,我现在的问题是,过期日期不应该在
date.now()之后吗
直到令牌过期。您不必编写任何代码来保持用户登录。正如我所说,只要你不注销,它就会自动发生。@DougStevenson好吧,你是对的,但为什么会发生呢??新的令牌exp是欧洲-West1,我在中东,这是问题吗?因为当我使用邮递员使用令牌模拟请求时,它总是返回一条消息说我使用expiered令牌,但当我创建对firebase的实际请求时,这不会发生??