#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 и когда он присутствует в запросе.