Javascript 使用哈希密码对jwt进行签名,而不是查询黑名单令牌数据库
我试图找出刷新身份验证令牌的最佳方法。我遇到有人说,在发布刷新令牌时,可以使用用户散列的密码对该令牌进行签名。然后,如果令牌被盗出现问题,用户只需更改其密码,一切又恢复正常。这是一个有效的策略还是有问题。我可以发送存储在刷新jwt中的用户id,并在刷新时查询数据库。我知道jwt的目的是要从数据库中分离出来,但是如果您需要某种方法将令牌列入黑名单,那么您无论如何都需要查询某种数据库或表。您可以执行以下操作: 使用用户哈希密码签名Javascript 使用哈希密码对jwt进行签名,而不是查询黑名单令牌数据库,javascript,node.js,authentication,jwt,Javascript,Node.js,Authentication,Jwt,我试图找出刷新身份验证令牌的最佳方法。我遇到有人说,在发布刷新令牌时,可以使用用户散列的密码对该令牌进行签名。然后,如果令牌被盗出现问题,用户只需更改其密码,一切又恢复正常。这是一个有效的策略还是有问题。我可以发送存储在刷新jwt中的用户id,并在刷新时查询数据库。我知道jwt的目的是要从数据库中分离出来,但是如果您需要某种方法将令牌列入黑名单,那么您无论如何都需要查询某种数据库或表。您可以执行以下操作: 使用用户哈希密码签名 const { email, password } = req.bo
const { email, password } = req.body
const user = await User.findOne({ email })
if (!user || !user.verified)
return res.status(401).json({ msg: 'Invalid login attempt' })
await bcrypt.compare(password, user.password)
const accessToken = jwt.sign({ id }, process.env.JWT_SECRET_ACCESS, {
expiresIn: '5m',
})
const refreshToken = jwt.sign({ id }, user.password + process.env.JWT_SECRET_REFRESH, {
expiresIn: '1m',
})
res.cookie('accessToken', accessToken, {
httpOnly: true,
})
res.cookie('refreshToken', refreshToken, {
path: '/auth/refresh-tokens',
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 180),
httpOnly: true,
})
然后,当需要刷新令牌时,您可以只检查数据库
const token = req.cookies.refreshToken
const { id } = jwt.decode(token)
const user = await User.findOne({ id })
jwt.verify(token, user.password + process.env.JWT_SECRET_REFRESH)
这是一个有效的策略还是这样做有什么不对。与试图查找黑名单上的令牌或存储黑名单上的令牌相比,数据库上的压力似乎是一样的。“但是如果您需要某种方法将令牌列入黑名单”-那么是的,您可能不应该使用令牌,而应该使用简单的会话存储。“这似乎与试图寻找黑名单上的令牌或存储黑名单上的令牌对数据库造成的压力相同。“-黑名单方法更有效,因为黑名单令牌比密码少得多,黑名单令牌将过期,因此列表将自动缩小。但是,如果将这两个数据都存储在数据库中,则是相同的请求数/压力级别(唯一的区别可能是缓存中保存的表的大小)。