Обновление пароля в Mon goose с предварительным хуком приводит к паспорту. js Проверка пароля не удалась - PullRequest
4 голосов
/ 22 апреля 2020

Я реализовал аутентификацию по паролю с помощью паспорта и локальной аутентификации в 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 для ловушки обновления?

...