Я реализовал аутентификацию по паролю с помощью паспорта и локальной аутентификации в Node.js, а именно:
userSchema.pre('save', function (next) {
if (this.password) {
this.salt =
Buffer.from(crypto.randomBytes(16).toString('base64'), 'base64');
this.password = this.hashPassword(this.password);
}
next();
});
userSchema.methods.hashPassword = function (password) {
return crypto.pbkdf2Sync(password, this.salt, 10000,
64, 'sha512').toString('base64');
};
Теперь я добавил предварительный хук для обновления пароля, где я создаю новую соль и ха sh новый пароль. Само обновление выполняется, но получающиеся новые соль и пароль ha sh не проходят проверку пароля. Я добавил этот код (который немного сырой, но сейчас я был бы рад, если бы концепция работала):
userSchema.pre('findOneAndUpdate', function (next) {
if (this._update.password) {
this.salt =
Buffer.from(crypto.randomBytes(16).toString('base64'), 'base64');
this._update.salt = this.salt;
this._update.password = crypto.pbkdf2Sync(this._update.password, this.salt, 10000,64,'sha512').toString('base64');
}
next();
});
Обновление выполняется с помощью этого кода:
users.findOneAndUpdate({email: req.body.emailadres },
{password: req.body.password}).exec();
Я вижу, что значения соли и пароля обновляются в коллекции, но аутентификация возвращает ошибку при входе в систему после обновления. Я ожидаю, что обновление полей, как в приведенном выше коде, должно работать. Я что-то пропустил? Кроме того, как можно повторно использовать hashPassword для ловушки обновления?