需要帮助了解NodeJS / PassportJS如何工作

时间:2018-04-26 07:06:56

标签: javascript angularjs node.js express passport.js

我从互联网下载的一个工作项目中获取了以下3个代码片段:

文件: ./ routes.js

// ...
var passport = require('passport');
var requireLoginLocal = passport.authenticate('local', { session: false });
var authController = require('./controllers/authController');
// ...

module.exports = function(app) {
	// ...
	authRoutes.post('/login/local', requireLoginLocal, authController.login);
	// ...
}

文件: ./ config / passport.js

// ...
var LocalStrategy = require('passport-local').Strategy;
// ...

module.exports = function(passport) {
    passport.use(new LocalStrategy({
            usernameField: 'email' /* changing default */
        },
        function(email, password, done) {
            email = email.toLowerCase();
            User.findOne({
                    'email': email
                },
                function(err, user) {
                    if (err) {
                        return done(err);
                    }
                    if (!user) {
                        return done(null, false, { error: 'Login failed. Please try again.' });
                    }
                    user.comparePassword(password, function(err, isMatch) {
                        if (err) {
                            return done(err);
                        }
                        if (!isMatch) {
                            return done(null, false, { error: 'Login failed. Please try again.' });
                        }
                        return done(null, user);
                    });
                }
            );
        }
    ));
};

file: ./ controllers / authController.js

// ...
exports.login = function(req, res, next) {
	var userInfo = getUserInfo(req.user);
	res.status(200).json({
		token: 'JWT ' + generateToken(userInfo),
		user: userInfo
	});
}
// ...

我有以下问题:

1 - 在文件:./routes.js上,该行:

authRoutes.post('/login/local', requireLoginLocal, authController.login);

数据如何从第二个参数传递到第三个参数?

2 - 在文件:./config/passport.js上,这些返回值如何影响上面一行中从第二个参数传递到第三个参数的值?

3 - 在文件:./controllers/authController.js上,在函数:exports.login上,没有返回任何内容,因此,它如何影响从第3个参数传递的值和可能的关于假设线的第四个论点,如上面那个?

2 个答案:

答案 0 :(得分:0)

您的第1和第2个问题已关联。这是节点在这种情况下特别表达的中间件模式。This arcticle解释了这个非常好的IMO。

根据我的理解和简单的术语,它们是传递req,res对象(info here)的函数,通过添加它们自己的更改。

enter image description here

在您的代码中,您需要的LoginLocal将根据需要添加到响应对象并接下来调用,在这种情况下,node会将响应对象传递给authController.login,依此类推。当链中的所有中间件都进行了必要的更改后,最终响应将作为http响应发送

关于你的第二个问题,它可能被护照用于配置。护照中间件的实际中间件由此行提供

passport.authenticate('local', { session: false });

由于这是节点的深层次基础主题,您可以谷歌搜索节点中间件,并且可以找到大量有关此内容的文章

答案 1 :(得分:-2)

您的问题的答案:

  1. 请参阅官方express documentation
  2. 这是passportjs的主要功能,它充当身份验证中间件,请参阅passport-local documentation
  3. 单个路由可以有多个回调,但只有当它依赖于前一个回调时。此外,任何路由回调都可以通过向客户端发送状态响应来终止整个将控制转移到下一个回调流程。