我在一篇关于使用JWT进行React身份验证的博客(此处)中看到了以下设置:访问令牌过期时间为15分钟,刷新令牌过期时间为1个月;每10分钟,客户端调用
在服务器上,
到目前为止,一切都很好。但是,在返回响应之前,还会生成一个新的refreshToken,并将其替换为用户的refreshTokens数组中的旧令牌...我认为这种策略存在缺陷,因为这样用户将永远不会看到他的登录过期,即使刷新令牌(在此示例中为一个月)过期...
我进行了一些测试(将1个月的值降低到30分钟),实际上用户授权永远不会过期...强制注销用户并删除其refreshTokens数组显然是有效的,但当刷新令牌因年龄过期时,我希望能够注销用户。
我想知道我的理解是否正确(服务器上的refreshToken端点不应刷新refreshToken,而只应刷新accessToken),或者我是否遗漏了什么。
在@Ghero的评论后进行更新: 我明白你的观点...但如果不更新它的到期时间,为什么要刷新令牌?
然而,博客中的代码用于更新refresh token:
/refreshToken
端点,检查刷新令牌是否仍然有效(否则用户将显示登录屏幕)。在服务器上,
/refreshToken
端点正确检查refreshtoken是否过期,具有refreshtoken负载中id的用户仍然存在且有效(即:传递的refreshtoken存在于其refreshTokens数组中)。如果一切正常,将生成新的访问令牌,并与响应一起发送。到目前为止,一切都很好。但是,在返回响应之前,还会生成一个新的refreshToken,并将其替换为用户的refreshTokens数组中的旧令牌...我认为这种策略存在缺陷,因为这样用户将永远不会看到他的登录过期,即使刷新令牌(在此示例中为一个月)过期...
我进行了一些测试(将1个月的值降低到30分钟),实际上用户授权永远不会过期...强制注销用户并删除其refreshTokens数组显然是有效的,但当刷新令牌因年龄过期时,我希望能够注销用户。
我想知道我的理解是否正确(服务器上的refreshToken端点不应刷新refreshToken,而只应刷新accessToken),或者我是否遗漏了什么。
在@Ghero的评论后进行更新: 我明白你的观点...但如果不更新它的到期时间,为什么要刷新令牌?
然而,博客中的代码用于更新refresh 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天。这样它就永远不会过期了...