1

所以我正在尝试使用快速服务器passportpassport-jwt使用快速服务器的身份验证技术。这是我一直在使用的代码

const JwtStrategy = require("passport-jwt").Strategy;
const ExtractJwt = require("passport-jwt").ExtractJwt;
const User = require("../models/user");
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = "secret";
module.exports = passport => {
    passport.use(
        new JwtStrategy(opts, (jwt_payload, done) => {
            User.findById(jwt_payload.id,(err,user)=>{
                if(err){
                    return done(err,false);
                }
                if(user){
                    done(null,user);
                }
                else{
                    done(null,false);
                }
            })
        })
    )
};

因此,使用此护照授权的全部目的是尽量减少访问数据库的次数,对吧?

但是在这段提取token后的代码中,通过findById查找用户是否在数据库中的方法访问数据库,那么如果每次认证请求都访问数据库,那么这一切有什么意义呢?

我很确定我说错了什么,非常感谢澄清此事的一些帮助。

4

1 回答 1

1

问题是,为什么需要User.findById在中间件上做?

您无需访问中间件上的数据库即可从 JWT 有效负载中查找用户是否存在。当用户通过/login端点获取 jwt 时,您应该已经检查过用户是否存在

// just a logic example on the login enpoint

const user = User.findUserByEmail(req.body.email);
if (!user) res.sendStatus(401); //returns 401 if user not found
else {
    if (verifyPassword(req.body.password, password)) {
        res.send(generatedJwtWithUserIdOnThePayload)
    } else {
        res.sendStatus(401); //returns 401 if password invalid
    }
}

登录到客户端时传递的 jwt 中已经有有效的用户 ID,因此您不需要在每次客户端向您的其他端点发送请求时获取User文档。User.findById

由于用户 id 已经在有效负载中,除非您需要User文档中的用户 id 之外的其他数据,否则您实际上不需要User.findById在中间件上做

于 2020-11-25T17:04:55.103 回答