Passport身份验证中的粒度错误处理

时间:2014-12-17 20:59:56

标签: node.js express passport.js

我在REST调用中对用户进行身份验证,并按照文档中的说明实现自定义回调。

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    //.. do something with user here and send a response
  })(req, res, next); 
});

现在,如果策略中的某些验证失败,我想传递一个错误。

passport.use(new BasicStrategy(
function(email, password, callback) {

User.findOne({
  email: email
}, function(err, user) {
  if (err) {
    return callback(err);
  }

  if (!user) {
    return callback(new Error('User unknown'), false);
  }

  // Make sure the password is correct
  user.verifyPassword(password, function(err, isMatch) {
    if (err) {
      return callback(err);
    }

    // Password did not match
    if (!isMatch) {
      return callback(new Error('Password mismatch'), false);
    }

    // Success
    return callback(null, user);
  });
});

}

但错误永远不会传递给authenticate中的回调:

function(err, user, info) {
     // err is always null
}

如何传递错误以便我可以向用户提供更详细的反馈?

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在两个问题。第一个是您要求本地'注册BasicStrategy时的身份验证策略。为了做到这一点,你应该替换当地的'与' basic'。

第二个是,如果你想使用BasicStrategy,你必须使用HTTP协议支持的基本身份验证,否则不会调用BasicStrategy的回调,你的身份验证回调将运行错误== null和user == false。

我使用Postman进行了测试,只有在我发送Basic Auth信息后,才会运行BasicStrategy回调。

我希望这会有所帮助。