Passport-Local Mongoose - сменить пароль?

Я использую Passport-Local Mongoose для шифрования пароля учетной записи. Но я не знаю, как сменить пароль.

Можете ли вы дать какой-нибудь документ или пример для этого? Спасибо.

Ответы

Ответ 1

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

schema.methods.setPassword = function (password, cb) {
    if (!password) {
        return cb(new BadRequestError(options.missingPasswordError));
    }

    var self = this;

    crypto.randomBytes(options.saltlen, function(err, buf) {
        if (err) {
            return cb(err);
        }

        var salt = buf.toString('hex');

        crypto.pbkdf2(password, salt, options.iterations, options.keylen, function(err, hashRaw) {
            if (err) {
                return cb(err);
            }

            self.set(options.hashField, new Buffer(hashRaw, 'binary').toString('hex'));
            self.set(options.saltField, salt);

            cb(null, self);
        });
    });
};

Ответ 2

Нет необходимости аутентифицироваться. Извлеките пользователя из учетной записи с помощью метода findByUsername(), который был помещен в модель с помощью паспорта-локального-mongoose, затем запустите setPassword(), а затем user.save() в обратном вызове.

userModel.findByUsername(email).then(function(sanitizedUser){
    if (sanitizedUser){
        sanitizedUser.setPassword(newPasswordString, function(){
            sanitizedUser.save();
            res.status(200).json({message: 'password reset successful'});
        });
    } else {
        res.status(500).json({message: 'This user does not exist'});
    }
},function(err){
    console.error(err);
})

Я вызываю пользователя sanitizedUser(), потому что я настроил паспорт-local-mongoose, чтобы не возвращать поля пароля или солей, используя findByUsername() и параметры паспорта в модели.

Ответ 3

Хороший ответ, но для тех, кто приходит из стека MEAN (использует паспорт-локальный, а не паспорт-локальный-мангуст):

//in app/models/user.js

/**
 * Virtuals
 */
UserSchema.virtual('password').set(function(password) {
    this._password = password;
    this.salt = this.makeSalt();
    this.hashed_password = this.encryptPassword(password);
}).get(function() {
    return this._password;
});

Итак, это изменит проход:

user.password = '12345678';//and after this setter...
user.save(function(err){ //...save
    if(err)...
});

Ответ 4

Я думаю, что вы можете использовать метод changepassword, который был реализован в версии 4.1.0

https://github.com/saintedlama/passport-local-mongoose/blob/master/CHANGELOG.md#410--2017-08-08

Для ознакомления с реализацией вы можете проверить письменные тесты по следующему адресу:

https://github.com/saintedlama/passport-local-mongoose/blob/807d9cf669f7a7c433eb0206c97574761c03b8e5/test/passport-local-mongoose.js#L217

Ответ 5

Как указано в других ответах, вам нужно получить новый экземпляр объекта user из базы данных, который является асинхронным, поэтому вам нужно либо дождаться, либо использовать функцию callback/Promise, как это...

User.findOne({ username: req.user.username })
.then((u) => {
    u.setPassword(req.body.newPassword,(err, u) => {
        if (err) return next(err);
        u.save();
        res.status(200).json({ message: 'password change successful' });
    });

})