我正在尝试使用Passportjs,自定义回调的代码是:
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
我对所有这些代码感到满意,除了倒数第二行(req, res, next);
- 有人可以解释为什么在最后添加这些参数。这可能是一个JS问题而不是Passport问题,但是非常感谢任何帮助。
答案 0 :(得分:4)
" javascript"答案是它返回一个函数,该函数使用那些第二组参数再次调用。
该功能是"累加器,用于链中每个策略的失败"。
https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js
答案 1 :(得分:2)
您可以在没有匿名函数或自定义回调的情况下重写它。只需使用护照的passport.use(new LocalStrategy())
功能即可创建新策略。 See 'Configure' docs。
passport.use(new LocalStrategy(
function(username, password, done) {
logIn({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
您需要做的唯一更改是将logIn
函数移动到此文件中,而不是移动到req
的方法。然后你可以像这样简单地调用passport.authenticate
:
app.get('/login', passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }));
因此,您只需使用内置successRedirect
和failureRedirect
属性的护照,而不是在回调中使用res.redirect。您也可以在authentication page上看到他们的文档。
答案 2 :(得分:0)
Connect / Express 中间件功能有签名:
function(req, res, next)
passport.authenticate()
可用作中间件,例如:
app.post('/login', passport.authenticate('local'), nextMiddleware);
这意味着authenticate()
会返回一个中间件函数对象,您可以使用(req, res, next)
参数来唤醒它,以继续应用程序的请求 - 响应周期。