【问题标题】:expiration date of decoded token from firebase compared to Date.now()与 Date.now() 相比,来自 firebase 的解码令牌的到期日期
【发布时间】:2021-03-12 02:44:37
【问题描述】:

我正在使用 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() 进行比较,因此当令牌到期时,用户会重定向到 login 页面,但让我感到困惑的是Date.now() 的值大于exp*1000 的值一个新的令牌,

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

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

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

【问题讨论】:

  • 仅供参考:Firebase Auth SDK 根据需要每小时自动刷新用户的令牌。通常,开发人员允许这样做以使用户保持登录状态,只要他们愿意。我很好奇你为什么要尝试做一些不同的事情。
  • @DougStevenson 我不想做一些不同的事情,我希望用户保持登录状态,即使单击导航栏中的登录链接未定向到登录页面,我现在的问题应该不会过期日期在date.now() 之后直到令牌过期。
  • 您不必编写任何代码来让用户保持登录状态。正如我所说,只要您不退出,它就会自动发生。
  • @DougStevenson 好吧,你是对的,但为什么会这样呢?新的令牌 exp 是

标签: javascript reactjs firebase firebase-authentication refresh-token


【解决方案1】:

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

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

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

这样做效果更好:

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

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

【讨论】:

  • 感谢 Gary,但这个讨厌的问题仍然存在,date.now() 仍然更大!。
  • 也许令牌 exp 声明有一个意外的值。也许使用online tool 将令牌的 exp 声明与当前纪元时间进行比较。如果 exp 声明不像预期的那样在未来,那么它可能是某种配置问题 - 甚至是不正确的供应商实施。如果是这样,这不是一个阻塞问题 - 我已经使用 OAuth 多年了,从未觉得需要检查令牌到期时间。
  • 问题可能是因为我的当地时间,我使用的是europe-west1的firebase云功能,我在中东,这可能是问题吗,因为当我使用邮递员来模仿时使用令牌的请求它总是返回一条消息,说我使用过期令牌但是当我创建对 firebase 的实际请求时,这不会发生??
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2018-01-06
  • 2021-06-11
  • 2016-04-27
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2015-06-24
相关资源
最近更新 更多