我是一个初学者,使用了一个教程进行身份验证。我正在使用jwt,并在此基础上添加了一个中间件。我不知道/认为它是正确的:
1.由于我使用jwt,我在我的中间件中验证令牌,都是正确的。然而,我也从有效载荷中获取用户ID,向数据库发出请求,如果我找到一个用户,我就把它放在req. user上。那么我是不是没有达到使用 JWT 的全部目的呢?使用jwt的目的不就是不要每次都向数据库发出请求吗?
1.这与使用jwt无关,但如果我的中间件很好,当没有数据库连接时,在我从数据库获取用户的时候,我得到了一个有意义的错误,但不知何故,错误没有得到处理,即使我有一个catch。我做错了吗?谢谢你,谢谢
module.exports = (req, res, next) => {
const { authorization } = req.headers;
try {
if (!authorization) return res.status(401).send({error: 'you must be logged in'})
const token = authorization.replace('Bearer ', "");
jwt.verify(token, 'MY_SECRET_KEY', async (err, payload) => {
if (err) return res.status(401).send({error: 'you must be logged in'})
const {userId} = payload;
const user = await User.findById(userId);
if (user) req.user = user;
else return res.status(401).send({error: 'you must be logged in'})
next();
})
} catch (err) {
res.status(400).send("too bad its an err")
}
};
字符串
1条答案
按热度按时间y3bcpkx11#
那么我是不是没有达到使用 JWT 的全部目的呢?使用jwt的目的不就是不要每次都向数据库发出请求吗?
相信你的jwt。如果你不能信任JWT中的数据,那么你可能有安全问题。每次通过调用DB来验证用户使得使用无状态身份验证几乎毫无意义。
如果用户数据或负载中包含的数据有很多变化**,您可以实现refreshToken**,并给予普通令牌一个短的到期时间(例如1小时),然后使用refreshToken发出新令牌:此时,您只需对数据库进行一次调用,就可以验证用户并最终更新有效负载。
如果您需要更高级别的安全性,您还可以考虑加密整个有效负载(但这会延长编码/解码时间)。
也请看看这些答案:JWT vs cookies for token-based authentication
Is it more efficient to store the permissions of the user in an JWT claim or to check it on the server at every request?的
但不知何故,错误没有被处理,即使我有一个catch。
你说的“* 不知何故错误没有被处理 *"是什么意思?看来你是用快递作为后台。错误是由父函数捕获还是在全局处理程序中捕获?请用一个例子更新你的问题,我会更新我的答案。