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

时间:2014-10-07 12:41:10

标签: node.js passport.js passport-local

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

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属性将设置为经过身份验证的用户。

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

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

2 个答案:

答案 0 :(得分:14)

您应该查看passport docs中的自定义回调部分,其中介绍了如何覆盖处理身份验证请求的内置行为。您可以编写一个自定义回调,它将服务于您从策略中调用的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调用或数据库操作的响应,使用策略中设置的erruserinfo等各种可用参数调用done函数。这些参数将由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);
    });
  }
));

答案 1 :(得分:0)

在我的情况下,我不希望出现401错误(这是“默认行为”), 而且我只是想要一个简单的重定向,如果该用户未被授权。简单的 EditText editText=(EditText)findViewById(R.id.user_message); 对我有用,如PassportJS documentation中所述(在“概述”和“重定向”标头中)

  

尽管身份验证涉及复杂性,但代码却没有   必须很复杂。

{ failureRedirect: '/login' }
  

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

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

我非常确定“失败”包括没有用户的情况:app.post('/login', passport.authenticate('local', { successRedirect:'/', failureRedirect: '/login' })); ,但我不确定失败是否包括错误情况:{ {1}}(如accepted answer.

所示)