14

根据文档,如果我像这样处理身份验证请求,我将能够捕获成功的尝试。

app.post('/login',
  passport.authenticate('local'),
  function(req, res) {
    // If this function gets called, authentication was successful.
    // `req.user` contains the authenticated user.
    res.redirect('/users/' + req.user.username);
  });

但是,就像文档说的那样:

默认情况下,如果身份验证失败,Passport 将响应 401 Unauthorized 状态,并且不会调用任何其他路由处理程序。如果身份验证成功,将调用下一个处理程序并将 req.user 属性设置为经过身份验证的用户。

如何处理未经授权的登录尝试?

我知道我可以使用自定义中间件来处理它,但有更好的方法吗?

4

2 回答 2

22

您应该查看护照文档中的自定义回调部分,该部分解释了如何覆盖处理身份验证请求的内置行为。您可以编写一个自定义回调,该回调将用作您从策略中调用的函数。done

app.get('/login', function(req, res, next) {
  /* look at the 2nd parameter to the below call */
  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);
});

查看passport.authenticate调用的第二个参数,它将作为done您从本地策略调用的函数。

请参阅done下面代码中调用的函数,这是您为护照定义的本地策略。您可以根据 API 调用或 db 操作的响应从策略中设置done各种可用参数(如erruser、 )来调用该函数。info这些参数将在passport.authenticate调用中由上述函数定义处理。

passport.use(new LocalStrategy(
  function(username, password, done) {
    /* see done being invoked with different paramters
       according to different situations */
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));
于 2014-10-07T12:54:07.170 回答
6

在我的情况下,我不想要 401 错误(这是“默认行为”),如果用户没有被授权,我只想要一个简单的重定向。正如PassportJS 文档(在“概述”和“重定向”标题中)中所解释的那样,简单{ failureRedirect: '/login' }的方法对我有用

尽管身份验证涉及复杂性,但代码不必复杂。

app.post('/login', passport.authenticate('local', { successRedirect:'/',
                                                    failureRedirect: '/login' }));

在这种情况下,重定向选项会覆盖默认行为。验证成功后,用户将被重定向到主页。如果身份验证失败,用户将被重定向回登录页面以再次尝试。

接受的答案为您提供了更大的灵活性。但是这个答案有点简单。

我很确定“失败”包括没有用户的情况:if (!user),但我不确定失败是否包括错误情况:if (err),如接受的答案所示。

于 2018-06-21T04:26:14.410 回答