了解Passportjs自定义回调

时间:2014-05-07 16:29:52

标签: javascript passport.js

我正在尝试使用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问题,但是非常感谢任何帮助。

3 个答案:

答案 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' }));

因此,您只需使用内置successRedirectfailureRedirect属性的护照,而不是在回调中使用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)参数来唤醒它,以继续应用程序的请求 - 响应周期。