javascript - 与 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()的返回值
解决方案
这可能只是一个整数溢出错误 - 尝试这样写:
if(decodedToken.exp > Math.floor(Date.now() / 1000) {
}
但是,读取令牌的到期时间并不是一个好习惯,因为 API 可能会因为其他原因拒绝令牌,例如撤销和客户端和服务器之间的时钟差异。
这样做效果更好:
- 当从 API 收到 401 状态时,访问令牌被认为已过期
- 然后您尝试在授权服务器上刷新访问令牌 - 然后使用新的访问令牌重试 API 调用
- 最终刷新将失败,在这种情况下授权服务器将返回一个 invalid_grant 错误代码
- 此错误代码表示会话结束,然后您需要重定向用户重新登录
这是我的一个 React 示例中的一些示例代码,用于比较:
推荐阅读
- c++ - 使用向量的斐波那契数列
- windows - 我在 GAC 中列出的 DLL 在尝试引用时没有出现在 VS 中
- python - 如果出现超时异常,如何重新启动脚本
- python - 使用 scipy 进行低秩逼近
- ios - PhaseScriptExecution 失败,退出代码非零
- ruby-on-rails-4 - ActiveRecord 查询多个连接
- java-8 - 如何修复 Weblogic 12.1.3 启动 Java 8?
- hibernate - 从环境中加载 Persistence.xml
- web-crawler - 如何使用一些只有在点击后才可见的数据来阅读网站
- sql - 当用户输入为空时,如何停止在 SQL Server 中插入默认日期格式 1900-01-01