Używam Passport-Local Mongoose do szyfrowania hasła konta. Ale nie wiem, jak zmienić hasło. Ktoś wie jak to zrobić? TksPaszport-Local Mongoose - Zmień hasło?
15
A
Odpowiedz
19
Patrząc na źródło istnieje funkcja dodana do schematu o nazwie setPassword. Wierzę, że po uwierzytelnieniu możesz zadzwonić, żeby zmienić hasło dla użytkownika.
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);
});
});
};
6
Dobra odpowiedź, ale dla tych, którzy pochodzą ze stosu średniej (używa paszport-local, nie paszport-local-mangusta):
//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;
});
Więc byłoby to zmienić hasło:
user.password = '12345678';//and after this setter...
user.save(function(err){ //...save
if(err)...
});
9
Nie trzeba uwierzytelniać. Pobierz użytkownika z konta przy użyciu metody findByUsername()
, która została umieszczona w modelu przez paszport-local-mongoose, a następnie uruchom setPassword()
, a następnie user.save()
w oddzwonieniu.
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);
})
Wzywam użytkownikowi sanitizedUser()
bo skonfigurowany paszportu-local-mongoose aby nie powrócić hasło lub soli pól przy użyciu findByUsername()
i opcje paszport modelu.
Właśnie wypróbowałem to i to działa! To powinno być oznaczone jako zaakceptowana odpowiedź. –
Stary wątek, tak czy inaczej: w rzeczywistości nie potrzebujesz uwierzytelniania. Pobierz użytkownika z konta, setPassword, a następnie user.save w wywołaniu zwrotnym i gotowe. –
Uwierzytelnianie w tym sensie, że wiadomość e-mail "Zapomniałem hasła" lub inne sposoby zapewnienia, że użytkownik jest tym, za kogo się podaje – user1441287