我正在关注使用node,猫鼬和jwt的教程。我只是对下面的单个命令感到好奇。
为什么本教程使用命令user.findOne()。 ?
userSchema.statics.findByToken = function(token,cb){
var user = this;
jwt.verify(token,process.env.SECRET,function(err,decode){
user.findOne({"_id":decode,"token":token},function(err,user){
if(err) return cb(err);
cb(null,user);
})
})
}
该令牌是否已经通过jwt.verify()进行了验证?
为什么需要findOne()? 这个findOne()命令使用户似乎不止一个。由于在输入中只使用了一个令牌。
为什么他们不只返回“ _id”?
顺便说一句,这是令牌的制作方式:
userSchema.methods.generateToken = function(cb){
var user = this;
var token = jwt.sign(user._id.toHexString(),process.env.SECRET)
user.token = token;
user.save(function(err,user){
if(err) return cb(err);
cb(null,user);
})
}
这是在路由身份验证中使用.findToken()的方式:
const { User } = require('./../models/user');
let auth = (req,res,next) => {
let token = req.cookies.w_auth;
User.findByToken(token,(err,user)=>{
if(err) throw err;
if(!user) return res.json({
isAuth: false,
error: true
});
req.token = token;
req.user = user;
next();
})
}
module.exports = { auth }
答案 0 :(得分:0)
这是附加的安全步骤。假设出于某种原因,管理员删除了该用户,以便该用户无法访问该应用程序。但是,如果用户仍然具有有效的令牌,则他/她可以继续访问该应用程序。这是不可接受的。
因此在关键应用程序中,最好检查用户是否确实存在于数据库中。
为了使其更加安全,我们还需要在更改密码之前检查令牌是否已发行。如果用户怀疑或注意到有人偷了他/她的密码,这可能会有所帮助,因此,在用户更改密码后,必须使密码更改之前发出的令牌无效。