我正在学习使用node,mongoose和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 }
这是附加的安全步骤。假设出于某种原因,管理员删除了该用户,以便该用户无法访问该应用程序。但是,如果用户仍然具有有效的令牌,则他/她可以继续访问该应用程序。这是不可接受的。
因此,在关键应用程序中,最好检查用户是否确实存在于数据库中。
并且为了使其更加安全,我们还需要在更改密码之前检查令牌是否已发行,如果是,则应用程序必须拒绝该令牌。如果用户怀疑或注意到有人盗用了他/她的密码,这可能会有所帮助,因此,在用户更改密码之后,必须使在更改密码之前发行的令牌无效。