mongodb Nodejs jwt:我应该只验证jwt还是从我的auth中间件的数据库中获取用户?

ijxebb2r  于 2023-08-04  发布在  Go
关注(0)|答案(1)|浏览(84)

我是一个初学者,使用了一个教程进行身份验证。我正在使用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")
    }
};

字符串

y3bcpkx1

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。
你说的“* 不知何故错误没有被处理 *"是什么意思?看来你是用快递作为后台。错误是由父函数捕获还是在全局处理程序中捕获?请用一个例子更新你的问题,我会更新我的答案。

相关问题