Подтвердить что ты не робот

Экспресс-паспорт (node.js) обработка ошибок

Я посмотрел, как обработка ошибок должна работать в node через этот обмен стеками, но я не уверен, что делает паспорт, когда он терпит неудачу в аутентификации. У меня есть следующая LocalStrategy:

passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
  function(email, password, next) {

    User.find({email: UemOrUnm}, function(err, user){
      if (err) { console.log('Error > some err'); return next(err); }
      if (!user) { console.log('Error > no user'); return next('Incorrect login or password'); } 

      if (password != user.password) {
        return next(Incorrect login or password);
      }
      return next(null, user);
    });
  }
));

После того, как я увижу распечатку консоли "Ошибкa > некоторая ошибка", ничего больше не происходит. Я бы подумал, что он должен продолжить следующий путь с параметром ошибки, но, похоже, это не так. Что происходит?

4b9b3361

Ответ 1

Стратегия-реализация работает совместно с passport.authenticate как для аутентификации запроса, так и для обработки успеха/сбоя.

Предположим, что вы используете этот маршрут (которому передан адрес электронной почты и пароль):

app.post('/login', passport.authenticate('local', {
  successRedirect: '/loggedin',
  failureRedirect: '/login', // see text
  failureFlash: true // optional, see text as well
});

Это вызовет код в стратегии, где может произойти одно из трех условий:

  • Произошла внутренняя ошибка при попытке получить информацию пользователей (например, соединение с базой данных отсутствует); эта ошибка будет передана: next(err); это будет обрабатываться Express и генерировать ответ HTTP 500;
  • Предоставленные учетные данные недействительны (нет пользователя с указанным адресом электронной почты или пароль является несоответствием); в этом случае вы не генерируете ошибку, но вы передаете false в качестве объекта пользователя: next(null, false); это вызовет failureRedirect (если вы его не определите, будет создан HTTP-автоответ от HTTP 401);
  • Все проверяется, у вас есть действительный пользовательский объект, поэтому вы передаете его: next(null, user); это вызовет successRedirect;

В случае недопустимой проверки подлинности (но не внутренней ошибки) вы можете передать дополнительное сообщение вместе с обратным вызовом:

next(null, false, { message : 'invalid e-mail address or password' });

Если вы использовали failureFlash и установили промежуточное программное обеспечение connect-flash, поставляемое сообщение сохраняется в сеансе и может быть легко доступно для доступа, например, используется в шаблоне.

РЕДАКТИРОВАТЬ: также можно полностью обрабатывать результат процесса аутентификации самостоятельно (вместо паспорта, отправляющего перенаправление или 401):

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err); // will generate a 500 error
    }
    // Generate a JSON response reflecting authentication status
    if (! user) {
      return res.send({ success : false, message : 'authentication failed' });
    }
    // ***********************************************************************
    // "Note that when using a custom callback, it becomes the application's
    // responsibility to establish a session (by calling req.login()) and send
    // a response."
    // Source: http://passportjs.org/docs
    // ***********************************************************************
    req.login(user, loginErr => {
      if (loginErr) {
        return next(loginErr);
      }
      return res.send({ success : true, message : 'authentication succeeded' });
    });      
  })(req, res, next);
});

Ответ 2

Что сказал христианин, вам нужно добавить функцию

req.login(user, function(err){
  if(err){
    return next(err);
  }
  return res.send({success:true});
});

Таким образом, весь маршрут будет:

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err); // will generate a 500 error
    }
    // Generate a JSON response reflecting authentication status
    if (! user) {
      return res.send(401,{ success : false, message : 'authentication failed' });
    }
    req.login(user, function(err){
      if(err){
        return next(err);
      }
      return res.send({ success : true, message : 'authentication succeeded' });        
    });
  })(req, res, next);
});

источник: http://passportjs.org/guide/login/

Ответ 3

Вам нужно добавить req.logIn(function (err) { }); и выполнить перенаправление успеха внутри функции обратного вызова