Проверка подлинности паспорта застряла и не возвращает никакого значения - PullRequest
0 голосов
/ 12 ноября 2018

Эта аутентификация отлично работает

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

но я пытаюсь проверить поля формы перед аутентификацией с помощью экспресс-валидатора.

Я пришел с этим

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
    })
  }
});

Используя этот второй код, ничего не происходит, когда я отправляю форму, и клиент выдает сообщение об ошибке localhost не отправил данные через некоторое время. Первая часть работает нормально, я вижу все ошибки, когда я отправляю пустую форму и достигается метод аутентификации. Я подозреваю, что этот вопрос может частично ответить на мой или имеет отношение к теме, но я не могу этого понять.

В документации passport.js приведен пример с функцией, но функция вызывается только при успешной аутентификации, то есть после. Я хотел бы выполнить проверку поля перед проверкой подлинности.

Дайте мне знать, если вам нужен код passport.authenticate.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

У меня был точно такой же код и проблема при попытке ввести экспресс-валидатор.

Я могу подтвердить, что добавление дополнительных "(req, res, next);" до конца функции passport.authenticate позволяет завершить процесс аутентификации и / login для обработки.

Однако, похоже, что в базу данных не добавляются дополнительные пользователи после аутентификации паспорта одним только этим методом. Я думаю, что требуется специальный обратный вызов для паспорта, например ::10000

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

Пример использования: https://gist.github.com/Xeoncross/bae6f2c5be40bf0c6993089d4de2175e

0 голосов
/ 12 ноября 2018

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);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...