PassportJS, req.IsAuthenticated() всегда на шаг отстает при входе в систему и регистрации

#javascript #node.js #express #passport.js #ejs

#javascript #node.js #выражать #passport.js #ejs

Вопрос:

В настоящее время у меня возникла проблема с PassportJS. Я использую шаблон для рендеринга страниц (EJS). Вход в систему и регистрация всегда отстают на один шаг, поскольку при входе пользователя в систему у меня появляется другая панель навигации. Как только я нажимаю кнопку отправки с правильными учетными данными на странице входа, она не обновляет панель навигации перенаправляемого пользователя. Мне нужно либо обновить страницу, либо перейти по другой ссылке в приложении.

 passport.use(
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password"
    },
    function(email, password, done) {
      knex
        .select("*")
        .from("users")
        .where({ email })
        .first()
        .then(user => {
          if (!user) return done(null, false);
          const hash = user.password;
          bcrypt.compare(password, hash, function(err, res) {
            if (res === true) {
              return done(null, user);
            } else {
              return done(null, false);
            }
          });
        })
        .catch(err => {
          return done(err);
        });
    }
  )
);

app.post('/login', passport.authenticate(
  'local'), function(req, res, next) {
    if(req.user.id) {
      res.locals.isAuthenticated = req.isAuthenticated();
      console.log("===========> working", res.locals.isAuthenticated)
      res.locals.user = req.user;
      console.log("===========> working", res.locals.user)
      res.redirect('/')
    } else {
      res.redirect('/login')
    }
  }
);

app.use(function(req, res, next) {
  res.locals.isAuthenticated = req.isAuthenticated();
  res.locals.user = req.user;
  console.log(res.locals.isAuthenticated, res.locals.user)
  next();
});
 

Выше приведен код, который у меня есть с локальной стратегией. Две консоли.журналы с «======> working» показывают «true» и объект user с правильными учетными данными и выполняет правильное перенаправление.

Однако вторая функция показывает «false», не определено, пока я не обновлю.

Есть мысли о том, в чем может быть проблема? Большое спасибо!

Комментарии:

1. Файл passport.authenticate cookie будет отправлен. Файл cookie, когда он выдается, находится только в ответе. Чтобы файл cookie был в запросе, необходимо выполнить обратный переход. Ваша вторая функция выполняется безоговорочно, как промежуточное программное обеспечение. Это означает, что он заметит файл cookie только в самом следующем запросе. Это ожидаемо.

2. Большое спасибо за быстрый ответ! Я пытаюсь понять, что происходит, поскольку у меня мало опыта и я новичок в веб-разработке. Что вы подразумеваете под поездкой туда и обратно? Должен ли я отправить еще один запрос get при таком условии, как if (req.session amp;amp; !req.isAuthenticated()) { app.get(), etc ....} ? Я тоже в замешательстве, потому что по какой-то причине в Safari все работает нормально! Я консоль. зарегистрирован req.isAuthenticated() , и я получаю false , тогда POST /login и тогда true . Может ли это быть связано с Chrome?? или Safari выполняет дополнительный запрос на сервер для меня? Спасибо!

3. Обратите внимание, что console.log(req.isAuthenticated()) находится во второй средней функции: app.use(function(req, res, next) { console.log(req.isAuthenticated()); res.locals.isAuthenticated = req.isAuthenticated(); res.locals.user = req.user; next(); }); Кроме того, я протестировал его в Firefox, и он также работает:-/ (дополнительное обновление не требуется)

4. Повторный переход — это еще один запрос от браузера после того, как ваш сервер возвращает ответ. Тем не менее, вам определенно нужен http-отладчик (burp, fiddler), чтобы видеть запросы / ответы, а также когда добавляется файл cookie и когда он присутствует в запросе.