使用 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"});
}
我的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"});
}