认证技术疑点——护照
Doubts on Authentication Techniques - Passport
所以我在 express 服务器上尝试使用 passport
和 passport-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
方法访问数据库,判断用户是否在数据库中,如果在访问数据库的过程中访问数据库,这一切有什么意义呢?每个身份验证请求?
我很确定我说错了,非常感谢您帮助澄清这件事。
问题是,为什么需要在中间件上做 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.findById
获取 User
文档.
由于用户 ID 已经在有效负载中,除非您需要 User
文档中除用户 ID 之外的其他数据,否则您实际上不需要在中间件上执行 User.findById
所以我在 express 服务器上尝试使用 passport
和 passport-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
方法访问数据库,判断用户是否在数据库中,如果在访问数据库的过程中访问数据库,这一切有什么意义呢?每个身份验证请求?
我很确定我说错了,非常感谢您帮助澄清这件事。
问题是,为什么需要在中间件上做 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.findById
获取 User
文档.
由于用户 ID 已经在有效负载中,除非您需要 User
文档中除用户 ID 之外的其他数据,否则您实际上不需要在中间件上执行 User.findById