当用户通过 Web 浏览器的 ajax 请求登录到 Node.js Web 服务器时,我正在尝试实现访问和刷新令牌。
我有它,所以当他们登录时,它会创建一个新的访问和刷新令牌并将其保存到用户的 cookie,访问令牌将在 1 小时内过期,刷新令牌将在 30 天后过期。
然后,当用户执行某些操作时,例如查看索引页面(获取)或想要更新其个人资料(发布),Cookie 中的令牌就会得到身份验证:
我的令牌验证中间件:
exports.verifyAccessToken = (redirect) => (req, res, next) => {
const accessToken = req.cookies.accessToken;
const refreshToken = req.cookies.refreshToken;
log.debug("verifying, cookies:", req.cookies);
if (!accessToken) {
return redirect ? res.redirect("/login") : res.status(401).json({ message: 'Verification Error: Access Token missing' });
}
jwt.verify(accessToken, process.env.ACCESS_TOKEN_SECRET, (err, decoded) => {
if (err) {
if (!refreshToken) {
return redirect ? res.redirect("/login") : res.status(400).json({ message: 'Verification Error: Access Token invalid/expired, Refresh Token missing' });
}
jwt.verify(refreshToken, process.env.REFRESH_TOKEN_SECRET, (err, decoded) => {
if (err) {
return redirect ? res.redirect("/login") : res.status(403).json({ message: 'Verification Error: Refresh Token invalid/expired' });
}
helper.setNewAccessToken(res, decoded.email);
helper.setNewRefreshToken(res, decoded.email);
req.user = decoded;
next();
});
} else {
req.user = decoded;
next();
}
});
};
这是处理访问/刷新令牌的有效方法吗?我只是不明白刷新令牌是否被盗还有什么意义,整个事情都是多余的。
我是否应该将刷新令牌存储在其他地方,或者应该将其与访问令牌一起存储在 cookie 中?
实现这一点的正确方法是什么?我希望用户不必每小时不断地重新登录,同时确保一切都是安全的。
您的流程不正确,因为您不应同时发送访问令牌和刷新令牌。事实上,您应该为身份验证流程(使用访问令牌)和刷新流程(使用刷新令牌)拥有不同的端点。
在客户端,存储令牌的一种方法是在 cookie 中,但访问令牌和刷新令牌应尽可能分开。您可以对不同的端点使用 httpOnly 安全 cookie,这样令牌就不会被暴露。例如,刷新令牌只能在刷新端点使用 SSL 进行访问,并且理想情况下不应通过客户端的 JavaScript 进行访问,以减少攻击面。