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

时间:2017-01-28 18:31:57

标签: node.js json-web-token

我的MIDDLEWARE检查用户提供的令牌是否正确。 通过使用jsonwebtoken实现的secuirity控件是在中间件中,它工作正常。 我决定将所有这些安全检查移到另一个文件中: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
                    });
                }
            }
        });
    });
...

1 个答案:

答案 0 :(得分:2)

您正在将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"});
}