我是在节点js中开发apis的新手。最近我开始研究节点js应用程序,我使用jwt令牌进行身份验证。
我的jwt验证功能如下所示
var jwt = require('jsonwebtoken');
var config = require('../config.js')
var JwtValidations = {
//will validate the JTW token
JwtValidation: function(req, res, next, callback) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.query.token || req.headers['x-access-token'];
// decode token
if (token) {
// verifies secret and checks exp
jwt.verify(token, config.secret, callback);
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
}
}
module.exports = JwtValidations;
这个函数我正在传递一个回调函数,这样如果jtw令牌验证通过,我可以服务于请求。 bellow是将用户添加到系统的一个示例
// addmin a user to the database
router.post('/add', function(req, res, next) {
JwtValidations.JwtValidation(req, res, next, function(err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
} else {
retrunval = User.addUser(req.body);
if (retrunval === true) {
res.json({ message: "_successful", body: true });
} else {
res.json({ message: "_successful", body: false });
}
}
})
});
// addmin a user to the database
router.put('/edit', function(req, res, next) {
JwtValidations.JwtValidation(req, res, next, function(err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
} else {
User.UpdateUser(req.body, function(err, rows) {
if (err) {
res.json({ message: "_err", body: err });
} else {
res.json({ message: "_successful", body: rows });
}
});
}
})
});
正如你在这两个函数中看到的那样,我正在重复相同的代码段
return res.json({ success: false, message: 'Failed to authenticate token.' });
当且仅当JwtValidations.JwtValidation
不包含任何错误时,我如何避免这种情况并调用回调函数
答案 0 :(得分:2)
当且仅当JwtValidations.JwtValidation不包含任何错误时,我如何避免这种情况并调用回调函数
只需在回调之上处理它,无论是在JwtValidations.JwtValidation
本身还是在你回调周围的包装器。
如果您是在JwtValidations.JwtValidation
本身进行的,那么您可以在调用回调的地方执行此操作:
if (token) {
// verifies secret and checks exp
jwt.verify(token, config.secret, function(err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
}
callback(decoded);
});
} else /* ... */
现在,当您使用它时,您知道要么使用成功解码的令牌获得回调,要么根本不会收到回调,但会为您发送错误响应:
router.put('/edit', function(req, res, next) {
JwtValidations.JwtValidation(req, res, next, function(decoded) {
User.UpdateUser(req.body, function(err, rows) {
if (err) {
res.json({ message: "_err", body: err });
} else {
res.json({ message: "_successful", body: rows });
}
});
})
});
上面的代码使用了很多(旧式)NodeJS回调。这绝对没问题,但如果您使用promises,您可能会发现编写一些代码更简单。其中一个有用的功能是将返回路径分成两部分,一部分用于正常分辨率,一部分用于错误(拒绝)。
答案 1 :(得分:1)
使用jwt身份验证功能作为中间件功能而不是路由,快速文档中有大量示例。 http://expressjs.com/en/guide/using-middleware.html