【发布时间】:2021-01-30 11:19:15
【问题描述】:
我知道有两种方法。
1) 传递整个用户对象:
let payload = {
user: {
id: user._id,
name:user.name,
email:user.email,
username:user.username
},
}
let token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1d' })
2) 仅传递 _id:
let token = jwt.sign({ id: this._id }, process.env.JWT_SECRET, {
expiresIn: '1d',
});
在第二种方法中,每当我想访问受保护的路由时,我都必须使用存储在有效负载中的 _id 进行数据库调用以获取用户的详细信息。
// protect.js
// Verify token
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = await User.findById(decoded.id);
虽然在第一种方法中,我始终拥有完整的用户详细信息对象,而无需进行额外的数据库调用。
在阅读了几篇博客之后,我开始知道我们应该保持我们的负载轻量级,但我心中的问题是,另一方面,我们必须在每次访问受保护的路由时进行单独的数据库调用。 我想知道哪种方法更有效。
提前感谢您的回答:)
【问题讨论】:
-
第一种方法可能更有效,但最大的缺点是,如果您使用第一种方法并且用户更改了他们的姓名、电子邮件等,那么您将使用不正确的信息。我总是会进行额外的数据库调用以确保您拥有正确的数据
标签: javascript node.js jwt authorization jwt-auth