使用nodejs和jsonwebtokenlogin示例:无法读取令牌validation结果

我的MIDDLEWARE检查用户提供的令牌是否正确。 通过使用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)函数有问题。 但是我关心这个devise,所以如果你也有关于创作的build议,那么他们是非常受欢迎的。

为了完成这个画面,我调用了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); } } 

更新 :没有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"}); }