Nano Hash - криптовалюты, майнинг, программирование

Обработка ошибок Express Passport (node.js)

Я рассмотрел, как обработка ошибок должна работать в узле, с помощью этого вопроса Принципы обработки ошибок для приложений Node.js + Express.js?, но я не уверен, что делает паспорт, когда он не проходит аутентификацию. У меня есть следующая 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);
    });
  }
));

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


Ответы:


1

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

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

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

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

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

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

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

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

EDIT: также можно полностью обработать результат процесса аутентификации самостоятельно (вместо того, чтобы Passport отправлял перенаправление или 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);
});
29.03.2013
  • Спасибо! Я полагаю, что в моем случае я пытаюсь отправить неудачный ответ через ajax вместо перенаправления. Глядя на паспортные документы, я думаю, что это означает, что вместо этого я должен отформатировать свой маршрут с помощью обратного вызова пользовательской функции. 30.03.2013
  • Если это поможет, я отредактировал свой ответ, чтобы показать возможный способ самостоятельной обработки аутентификации :) 30.03.2013
  • Спасибо за самостоятельную обработку аутентификации, это спасло жизнь! 17.05.2014
  • Я использовал ваш собственный код аутентификации, но когда я вызываю req.isAuthenticated для будущих запросов, я получаю false 03.08.2014
  • @pka2012 pka2012 Я предполагаю, что первоначальная аутентификация сработала? Если это так, убедитесь, что обработка сеанса Express правильно настроена. 03.08.2014
  • @ thebiglebowski11 (я думаю), вам все равно нужно вызвать req.logIn(). Этот ответ демонстрирует это stackoverflow.com/a/26032067/2278963 01.12.2015
  • проголосовал! работает ли это для стратегии Google, я хочу обработать перенаправление и войти в систему пользователя самостоятельно для аутентификации Google, если бы я использовал этот обратный вызов, как бы я управлял перенаправлениями 20.02.2020

  • 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://www.passportjs.org/docs/login/

    12.05.2015

    3

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

    20.02.2015
  • Не могли бы вы пояснить свой ответ? 20.02.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..