使用 nodejs 和 jsonwebtoken 的登录示例:无法读取令牌验证结果

Login Example with nodejs and jsonwebtoken: can't read the token verification result

我的MIDDLEWARE检查用户提供的token是否正确。 通过使用 jsonwebtoken 实现的安全控制位于中间件内部并且运行良好。 在我决定将所有这些安全检查移动到另一个文件之后:TokenManger.js

但我不知道如何设置两个文件之间的代码。 试了很多方法都没用。

因此,为了更好地理解,我粘贴了以下示例代码,该代码不起作用。这是关于中间件的:

...
router.use(function(req,res,next){
        var token = req.body.token || req.query.token || req.headers['x-access-token'];
        //decode token
        if(token){
            TokenManager.verifyToken(token,true,function(err,key){
                if(err) return res.json({ success : false, message : "Failed to authenticate token"});
                else next();
            });
        }else{
            // no token, return error
            return res.status(403).send({
                success : false,
                message: 'No token provided!'
            });
        }
});
...

另一方面,这是 TokenManager.js:

的一个示例(并且不起作用)实现
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var config = require('../../config.js');

var TokenManager = { 
    createToken: function(user) {
        if(user.admin){
            var token = jwt.sign(user, config.SECRET_WORD.ADMIN,{expiresIn:config.EXPIRE_TIME.ADMIN_TOKEN});
        }else{
            var token = jwt.sign(user, config.SECRET_WORD.USER,{expiresIn:config.EXPIRE_TIME.USER_TOKEN});  
        }
        return token;
    },
    verifyToken: function(token, admin, decode){
        if(admin){
            //admin authentication
            jwt.verify(token, config.SECRET_WORD.ADMIN, function(err,key){
                if(err){
                    return false;
                }else{
                    return true;
                }
            });
        }else{
            //user authentication
            jwt.verify(token, config.SECRET_WORD.USER, function(err,key){
                if(err){
                    return false;
                }else{
                    return true;
                }
            });
        }
    }
}

module["exports"] = TokenManager;

实际上 createToken(user) 函数在前面的代码中工作正常,只有 verifyToken(token, admin, decode) 函数有问题。但我很在意设计,所以如果你对创作也有什么建议,我们非常欢迎。

为了完成图片,我是这样调用createToken(user)函数的:

...
.post(function(req,res){
        User.findOne({ username: req.body.username }, function(err,user){
            if(err) throw err;
            if(!user){
                res.json({ success: false, message: 'Authentication failed. User not found!' });
            }else{
                if(user.password != req.body.password){
                    res.json({ success: false, message: 'Authentication failed. Wrong password!' });
                }else{
                    //token creation
                    var token = TokenManager.createToken(user);
                    res.json({
                        success: true,
                        token: token
                    });
                }
            }
        });
    });
...

您正在将 function(err, key) 传递给 verifyToken,但 verifyToken 的签名中没有 callback

尝试将 verifyToken 函数更改为

verifyToken: function(token, admin, callback){
    if(admin){
        //admin authentication
        jwt.verify(token, config.SECRET_WORD.ADMIN, callback);
    }else{
        //user authentication
        jwt.verify(token, config.SECRET_WORD.USER, callback);
    }
}

更新:没有回调

verifyToken: function(token, admin){
    try {
       if(admin){
          //admin authentication
          jwt.verify(token, config.SECRET_WORD.ADMIN, callback);
       }else{
          //user authentication
          jwt.verify(token, config.SECRET_WORD.USER, callback);
       }
       return true;
    } catch(err)
       return false;
    }   
}

并在你的中间件中这样使用:

if (TokenManager.verifyToken(token,true)){
    return next();
} else {
    return res.json({ success : false, message : "Failed to authenticate token"});
}