我是node js的新手。我正在了解使用 jwt 进行身份验证。据我所知,快递中的请求处理程序是这样的
app.post('/login',function(req,res){...});
下面是我感到困惑的片段。
应用.js.
var userController = require('./Controllers/user');
var authController = require('./Controllers/auth');
var tokenController = require('./Controllers/validate');
var deviceController = require('./Controllers/device');
app.post('/login',userController.validate,authController.authorize,userController.login);
如果我们仔细观察,发布方法有 4 个参数。任何人都可以解释一下下面的功能是如何工作的吗?
app.post('/login',userController.validate,authController.authorize,userController.login);
还添加开发人员正在导入的 js 文件
用户.js
exports.validate = function(req,res,next) {
if(req.body.email === undefined){
return res.status(401).send({'message':'Email is required'});
}
if(req.body.password === undefined){
return res.status(401).send({'message':'Password is required'});
}
next();
};
const login = exports.login = function (req,res){
User.findOne({email:req.body.email},function(err, user){
if(err){
return res.status(401).send(err);
}
user.token = jwt.sign(user.password, 'TOPSECRETTTT');
user.save(function (err,user) {
if (err) {
res.send(err);
return;
}
res.status(200).send({email:user.email,loginToken:user.token});
})
});
};
身份验证.js
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
(function(username, password, callback) {
User.findOne({ email: username }, function(err, user) {
if (err) {
return callback(err);
}
if (!user) {
return callback(null, false);
}
user.matchPassword(password, function(err, isMatch) {
if (err) {
return callback(err);
}
if (!isMatch) {
return callback(null, false);
}
return callback(null, user);
});
});
})));
exports.authorize = passport.authenticate('local', { session: false });
让我知道是否有任何源/链接可以找到更多这样的实现。
正如评论中提到的,express是关于中间件的 - 如果它与路由匹配,它将按顺序通过这些中间件功能,直到达到res.send()
在这种情况下,中间件验证POST
数据,然后创建用户,对其进行身份验证,并返回授权令牌。每个中间件都使用一个next();
继续到链中的下一个中间件,如果它在任何时候失败,它会发送相应的失败响应,并带有具有错误状态代码的res.send()
。 在这种情况下401 Unauthorized
。