Nodejs Passport验证未调用回调

时间:2012-08-31 14:55:13

标签: node.js passport.js

使用Nodejs Passport,我正在使用以下代码测试出现错误情况时会发生什么:

passport.use(new LocalStrategy(
  function(username, password, done) {
    // asynchronous verification, for effect...
    process.nextTick(function () {
      findByUsername(username, function(err, user) {
    console.log('in auth function');
      return done('errortest');
        if (err) { return done(err); }
        if (!user) {
          return done(null, false, { message: 'Unknown user ' + username });
        }
        if (user.password != password) {
          return done(null, false, { message: 'Invalid password' });
        }
        return done(null, user);
      })
    });
  }
));

app.get('/logintest', function(req, res, next) {
console.log('before authenticate');
  passport.authenticate('local', function(err, user, info) {
console.log('authenticate callback');
    if (err) { return res.send({'status':'err','message':err.message}); }
    if (!user) { return res.send({'status':'fail','message':info.message}); }
    req.logIn(user, function(err) {
      if (err) { return res.send({'status':'err','message':err.message}); }
      return res.send({'status':'ok'});
    });
  })(req, res, next);
});

使用route / logintest?username = bob& password = s我希望在控制台中看到“在验证之前”然后“在auth函数中”然后“验证回调”但它只显示前两个后跟“errortest” “和”errortest“显示在浏览器中。

我也尝试了return done({'message':'test'});,并且在控制台和浏览器中显示了“[object Object]”。

这不能正常工作还是我错过了什么?

编辑:根据Jared Hanson的回复,将此错误处理函数添加为app.get()的第三个参数允许我捕获错误并返回相应的json:

...
    })(req, res, next);
  },
  function(err, req, res, next) {
    // failure in login test route
    return res.send({'status':'err','message':err.message});
  });

3 个答案:

答案 0 :(得分:17)

你完全理解它,并按预期工作。

如果发生任何错误,Passport立即next()出现该错误。如果要以自定义方式处理该错误,可以使用错误处理中间件(详细信息:http://expressjs.com/guide/error-handling.html)。

自定义回调主要用于处理身份验证成功或失败(user == false)。错误(如DB连接等)不会传递回回调,有利于上述错误处理中间件。我考虑过改变它,但没有找到令人信服的理由。但是,如果你有一个上面没有涉及的用例,请告诉我。

答案 1 :(得分:6)

bodyparser.json()引起了我的问题,我通过设置每条路线(特别是在护照路线上)来解决这个问题:

app.post('/login', bodyParser.urlencoded({ extended: true }), function (req, res, next) {
          passport.authenticate('local', function (err, user, info) {
               if (err) { return next(err) }
               if (!user) {
                    console.log('bad');
                    req.session.messages = [info.message];
                    return res.redirect('/login')
               }
               req.logIn(user, function (err) {
                    console.log('good');
                    if (err) { return next(err); }
                    return res.redirect('/');
               });
          })(req, res, next);
     });

答案 2 :(得分:2)

我遇到了同样的问题。然后放,

const bodyParser=require('body-parser');
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());