Passport.js регистрация / сброс пользователя перезагружается после сохранения пользователя, но до аутентификации, в результате чего автозаполнение заполняет старый пароль и завершается ошибкой
Я столкнулся с проблемой, которая проявляется только при использовании диспетчера паролей. У меня есть рабочий сброс пароля и регистрация, которые являются единственными случаями, когда пароль пользователя устанавливается перед автоматической аутентификацией после этого.
Вот что именно происходит:
Сценарий:
- Регистрация или сброс пароля с включенным менеджером паролей
- В диспетчере паролей сохранено "password_a"
- Новый пароль учетной записи, введенный пользователем: «password_b»
Результат:
- Req.body.password изначально "password_b"
- Пароль пользователя создан или настроен для исправления bcrypt.hash("password_b") в базе данных
- Authenticate(req, res) сравнивает то же самое поле req.body.password, но теперь это поле содержит «password_a», которое автоматически заполняется менеджером паролей.
- bcrypt.compare() в локальном методе аутентификации не работает, потому что пароли не совпадают.
Все остальные случаи работают правильно: без диспетчера паролей или с тем же паролем в диспетчере паролей.
//within router
(req, res) => {
const hashedPassword = await bcrypt.hash(req.body.password, 10);
//save user to database
const user = await User.create({
email: req.body.email,
password: hashedPassword,
});
//authenticate user directly after creating user.
var authenticate = passport.authenticate("local", {
successRedirect: "/home",
failureRedirect: "/onboard/" + req.params["token"],
failureFlash: true,
});
authenticate(req, res);
};
//passport config
function initialize(passport, getUserByEmail, getUserById) {
const authenticateUser = async (email, password, done) => {
const user = await getUserByEmail(email);
if (user == null) {
return done(null, false, { message: "No user with that email" });
}
try {
if (await bcrypt.compare(password, user.password)) {
return done(null, user);
} else {
//password and db encrypted password returned for debugging.
return done(null, false, {
message:
"Password incorrect" +
" body password: " +
password +
" db_bcrypted: " +
user.password,
});
}
} catch (e) {
return done(e);
}
};
passport.use(new LocalStrategy({ usernameField: "email" }, authenticateUser));
passport.serializeUser((user, done) => done(null, user.id));
passport.deserializeUser(async (id, done) => {
return done(null, await getUserById(id));
});
}```
The passport authenticate() method appears to be receiving new information from the client after somehow invoking the password manager autofill again, all in the same request chain. I'm sure this is an issue of my fundamental understanding of the request response structure in express. I'd love to know where I'm going wrong rather than disabling all password managers I can think of.