如何使用nodejs/passport处理未经授权的请求

Ada*_*ean 9 node.js passport-local passport.js

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

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);
  });
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

mit*_*esh 16

您应该查看护照文档中的自定义回调部分,其中介绍了如何覆盖处理身份验证请求的内置行为.您可以编写一个自定义回调,它将服务于您从策略调用的函数的目的.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);
});
Run Code Online (Sandbox Code Playgroud)

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

请参阅以下代码中调用的done函数,该函数是您为护照定义的本地策略.您可以调用来完成功能与像各种可用参数err,user,info根据来自API调用或数据库操作的响应从策略设置.这些参数将由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);
    });
  }
));
Run Code Online (Sandbox Code Playgroud)


The*_*Pea 6

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

尽管身份验证涉及复杂性,但代码并不一定很复杂。

app.post('/login', passport.authenticate('local', { successRedirect:'/',
                                                    failureRedirect: '/login' }));
Run Code Online (Sandbox Code Playgroud)

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

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

我敢肯定,“失败”包括就没有用户的情况:if (!user),但我知道,如果失败包括错误情况或不:if (err),如看到接受的答案。