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

Больше проблем с Passport.js - зависает при отправке формы

Я настраиваю то, что, по моему мнению, было бы самым простым auth - сайт загружается на экран журнала, пользователь вводит учетные данные в форме, при отправке я использую Passport.JS и Sequelize для проверки учетных данных. Большинство из них копируется из различных учебных пособий или самого веб-сайта Passport. Независимо от того, что я делаю, измените или попробуйте, сайт просто зависает, как только я нажимаю кнопку отправки формы. На вкладке "Инструменты инструментов разработчика" я просто покажу, как отправить запрос /login в ожидании.

Чтобы устранить все возможные дополнительные проблемы, я удалил Sequelize и использовал пользователей с жесткой кодировкой, например, локальный пример использования на странице паспорт github. Тем не менее, никаких изменений в Sequelize не было проблемой.

Я уверен, что это что-то немое. Я пробовал очевидные решения, например, чтобы убедиться, что моя форма отправляет "имя пользователя" и "пароль".

Моя форма выглядит следующим образом:

form(method="post", action="/login")
  fieldset
    legend Please Log In
    label(for="username") Username:
    input#username(type='text', name="username", autocomplete="off")
    label(for="password") Password:
    input#password(type='password', name="password")
    button#login(type="submit") Log In

В node my app.js использует маршрутизатор, который включает в себя следующее:

var login = require('../app/controllers/login');
app.get('/', login.index);
app.post('/login', login.auth);

Загрузка страницы выполняется в запросе get. На пост он направляет на это:

exports.auth = function (req, res, next) {
  console.log(req.body);
   passport.authenticate('local', {
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash: true
  });
};

Консоль .log(req.body) подходит отлично, показывая значения формы, поэтому мы в порядке с этой точкой. Но ничего не произошло. Это последняя часть:

passport.use(new LocalStrategy(
  function(username, password, done) {
    console.log('local strat invoked');
    findByUsername(username, function(err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
      if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
      return done(null, user);
    });
  }
));

Я поменял код, который использовал Sequelize, чтобы проверить БД для пользователя с помощью этой функции findByUsername (скопирован и вставлен прямо из вышеупомянутого сообщения на странице gigub паспорта), но в качестве console.log( "local strat invoked" ') никогда не подходит, я ничего не думаю о том, что после этого момента даже имеет значение.

Также включает в себя паспорт. СериализуетUser и passport.deserializeUser, но я не могу представить, что это проблема на этапе, где я застрял.

Любая идея, какой шаг мне не хватает, чтобы заставить это работать?

4b9b3361

Ответ 1

Паспорт - это промежуточное программное обеспечение, если вы вставляете его в функцию обработчика маршрута, вам нужно вызвать его:

exports.auth = function (req, res, next) {
  console.log(req.body);
  passport.authenticate('local', {
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash: true
  })(req, res, next);  // <-- NEED TO INVOKE WITH req, res, next
};

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

exports.auth = passport.authenticate('local', {
  successRedirect: '/home',
  failureRedirect: '/',
  failureFlash: true
});