Passport 身份验证卡住了,没有 return 任何值

Passport authenticate is stuck and does not return any value

这个验证工作正常

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

但我正在尝试使用 express-validator 在身份验证之前验证表单的字段。

我带着那个来的

app.post('/login', function(req, res){
  req.checkBody('email', 'Email is required').notEmpty();
  req.checkBody('email', 'Email is not valid').isEmail();
  req.checkBody('password', 'Password is required').notEmpty();
  var validationErr = req.validationErrors();

  if (validationErr){
    res.render('login', {
      errors: validationErr,
      failureFlash: true
    });
  } else {
    // authenticate once fields have been validated
    passport.authenticate('local-login', {
        successRedirect: '/home',
        failureRedirect: '/login',
        failureFlash: true // allow flash messages
    })
  }
});

使用第二个代码,当我提交表单并且客户端给出错误消息时没有任何反应本地主机没有发送任何数据 过了一会儿。第一部分工作正常,当我提交一个空表单并且到达身份验证方法时,我可以看到所有错误。我怀疑这个 question 可能部分回答了我的问题或者有点相关,但我无法理解它。

passport.js documentation 提供了一个函数示例,但只有在身份验证成功时才会调用该函数,所以之后。我想在认证前进行字段验证

如果您需要 passport.authenticate 代码,请告诉我。

passport.authenticate 是一个函数。在您的第一个(工作)代码中,您将其称为中间件,它在其中将 (req, res, next) 的对象作为参数传递。

在您的第二个代码中,您尝试不带参数直接调用它,而客户端由于未收到响应而超时。

如果我没有遗漏任何东西,您可以通过将 (req, res) 传递给它来完成这项工作,如下所示:

  if (validationErr){
      res.render('login', {
          errors: validationErr,
          failureFlash: true
      });
  } else {
      // authenticate once fields have been validated
      passport.authenticate('local-login', {
          successRedirect: '/home',
          failureRedirect: '/login',
          failureFlash: true // allow flash messages
      })(req, res, next);
  }

我在尝试引入 express-validator 时遇到了完全相同的代码和问题。

我可以确认添加了额外的“(req, res, next);”到 passport.authenticate 函数的末尾确实允许身份验证过程完成和 /login 处理。

然而,在 passport 单独使用此方法进行身份验证后,似乎没有其他用户添加到数据库中。我认为需要自定义护照回调,例如:

http://www.passportjs.org/docs/authenticate/

使用示例:https://gist.github.com/Xeoncross/bae6f2c5be40bf0c6993089d4de2175e