我在一篇博客 (here) 中看到关于使用 JWT 在 React 中进行身份验证的设置:访问 token 有效期为 15 分钟,刷新 token 有效期为 1 个月;客户每 10 分钟调用一次 /refreshToken
端点,检查 refreshToken 是否仍然有效(否则将显示用户登录屏幕)。
在服务器上,/refreshToken
端点正确检查 refreshtoken 没有过期,在 refreshtoken 有效负载中具有 id 的用户仍然存在且有效(即:传递的 refreshToken 存在于他的 refreshTokens 数组中)。如果一切正常,就会生成一个新的访问 token ,并与响应一起发回。
到目前为止,一切都很好。 但是 ,在返回响应之前,也会生成一个新的 refreshToken,并将旧的替换为用户的 refreshTokens 数组...我认为这种策略是有缺陷的,因为这样用户将 从不看到他的登录过期,即使在刷新 token (本例中为一个月)之后也会过期......
我确实做了一些测试(将 1 个月的值降低到 30 分钟),并且有效地用户授权永不过期......强制用户注销删除他的 refreshTokens 数组显然工作正常,但我希望在刷新时注销 token 按年龄过期。
我问我的理解是否正确(服务器上的 refreshToken 端点不应该刷新刷新 token ,而应该只刷新访问 token ),或者我是否遗漏了什么。
更新 在@Ghero 评论之后:
我明白你的意思......但是如果不更新它的到期,为什么要刷新它?
但是,用于更新刷新 token 的博客代码:
const jwt = require("jsonwebtoken");
exports.getRefreshToken = (user) => {
const refreshToken = jwt.sign(user, process.env.REFRESH_TOKEN_SECRET, {
expiresIn: eval(process.env.REFRESH_TOKEN_EXPIRY),
});
return refreshToken;
};
// REFRESH_TOKEN_EXPIRY is set to 30 days
看起来它总是将到期日期推迟 30 天。这样它就永远不会过期...
最佳答案
在每次使用时替换刷新 token 是当前的最佳实践。
拥有一次性使用刷新 token 意味着如果刷新 token 被盗并且多次使用(被您和黑客), token 服务可以检测到并自动注销用户,保护用户免受攻击。
刷新 token 有一个最长有效时间,例如 30 天,但这通常也是您可以配置的。根据您使用的服务,有不同的刷新 token 生命周期策略。下图展示了 IdentityServer 如何处理刷新 token :
关于javascript - JWT 刷新 token 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70893674/