用Mongoose验证jwt令牌.findOne()

问题描述 投票:1回答:1

我正在学习使用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 }
mongoose jwt
1个回答
0
投票

这是附加的安全步骤。假设出于某种原因,管理员删除了该用户,以便该用户无法访问该应用程序。但是,如果用户仍然具有有效的令牌,则他/她可以继续访问该应用程序。这是不可接受的。

因此,在关键应用程序中,最好检查用户是否确实存在于数据库中。

并且为了使其更加安全,我们还需要在更改密码之前检查令牌是否已发行,如果是,则应用程序必须拒绝该令牌。如果用户怀疑或注意到有人盗用了他/她的密码,这可能会有所帮助,因此,在用户更改密码之后,必须使在更改密码之前发行的令牌无效。

© www.soinside.com 2019 - 2024. All rights reserved.