passport-local-mongoose устанавливает новый пароль после проверки старого пароля

Я использую passportjs для обработки аутентификации моего приложения. После того, как пользователь вошел в систему, я хочу добавить возможность изменить пароль из приложения.

это в моем контроллере:

$http.post('/change-my-password',{oldPassword: $scope.user.oldpassword, newPassword: $scope.user.newpassword})
    .then(function (res) {
        if (res.data.success) {
            // password has been changed.
        } else {
            // old password was wrong.
        }
    });

и это мой обработчик маршрута в выражении nodejs в бэкэнде:

router.post('/change-my-password', function (req, res) {
    if (!req.isAuthenticated()) {
        return res.status(403).json({
            success: false
        });
    }
    UserSchema.findById(req.user._id, function(err, user){
        if (err) return res.status(200).json({success: false});

        user.validatePassword(req.body.oldPassword, function(err) {

            if (err){
                return res.status(200).json({
                    success: false
                });
            }

            user.setPassword(req.body.newPassword, function() {
                if (err || !user) {
                    return res.status(200).json(
                        {
                            success: false
                        }
                    )
                }

                user.save(function(err) {
                    if (err) return res.status(200).json({success: false});

                    req.login(user, function (err) {
                        if (err) return res.status(200).json({success: false});
                        return res.status(200).json({success: true});
                    });

                });
            });


        });


    });
});   

Вот моя модель схемы пользователя:

// user model
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
var bcrypt = require('bcrypt-nodejs');

var UserSchema = new Schema({
    email: String,
    password: String,
    confirmStatus: Boolean,
    token: String,
    registerAt: Number
});

UserSchema.methods.validatePassword = function (password, callback) {
    this.authenticate(password, callback);
};


UserSchema.plugin(passportLocalMongoose,
    {
        usernameField: 'email'
    });

module.exports = mongoose.model('users', UserSchema);

эта проблема:

Я нахожу своего пользователя по идентификатору в моей схеме Мангуста UserSchema тогда я должен проверить, если oldPassword действительно или нет, а затем я устанавливаю новый пароль.
Я успешно нахожу пользователя и устанавливаю новый пароль. Но та часть, которая должна проверять сравнение старого поля пароля, вообще не работает. Все, что я ввожу в поле старого пароля, принимает как ОК, и этот шаг пропускается. Принимая во внимание, что это должно выдать ошибку, говорящую, что старый пароль неправильный.


Мне также рекомендуется использовать sanitizedUser, чтобы не показывать мою соль и т. Д.

Вопрос: как я могу сначала проверить сравнение старого пароля, а затем выполнить установку нового пароля? Если возможно, как я могу использовать дезинфицирующее средство? И как я могу проверить, не вводит ли пользователь тот же пароль, что и новый пароль? или если можно сказать, что новый пароль очень похож на старый?

1 ответ

Вы можете реализовать его с помощью новой функции, добавленной 3 дня назад:

просто используйте changePassword метод, и он обрабатывает это через это:

schema.methods.changePassword = function(oldPassword, newPassword, cb) {
    if (!oldPassword || !newPassword) {
      return cb(new errors.MissingPasswordError(options.errorMessages.MissingPasswordError));
    }

    var self = this;

    this.authenticate(oldPassword, function(err, authenticated) {
      if (err) { return cb(err); }

      if (!authenticated) {
        return cb(new errors.IncorrectPasswordError(options.errorMessages.IncorrectPasswordError));
      }

      self.setPassword(newPassword, function(setPasswordErr, user) {
        if (setPasswordErr) { return cb(setPasswordErr); }

        self.save(function(saveErr) {
          if (saveErr) { return cb(saveErr); }

          cb(null, user);
        });
      });
    });
  };

поэтому в вашем коде вам нужно заменить метод validatePassword следующим:

user.changePassword(req.body.oldPassword,req.body.newPassword, function(err) {

            if (err){
                return res.status(200).json({
                    success: false
                });
            }

Надеюсь, что это работает для вас.

Другие вопросы по тегам