我的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
});
}
}
});
});
...
答案 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"});
}