Io uso Passport-Local Mongoose per crittografare la password dell'account. Ma non so come cambiare la password. Qualcuno sa come fare? TksPassport-Local Mongoose - Cambia password?
risposta
Guardando all'origine c'è una funzione che viene aggiunta allo schema chiamato setPassword. Credo che dopo l'autenticazione puoi chiamarlo per cambiare la password per l'utente.
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);
});
});
};
buona risposta, ma per quelli che provengono dalla pila MEDIA (usa passaporto locale, non il passaporto-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;
});
Quindi questo avrebbe cambiato il passo:
user.password = '12345678';//and after this setter...
user.save(function(err){ //...save
if(err)...
});
Non è necessario autenticarsi. Recupera utente dall'account utilizzando il metodo findByUsername()
, che è stato inserito nel modello tramite passaporto-locale-mangusta, quindi eseguito setPassword()
, quindi user.save()
nella richiamata.
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);
})
io chiamo l'utente sanitizedUser()
perché ho configurato passaporto-local-mangusta di non restituire i campi della password o sale usando findByUsername()
e le opzioni di passaporto nel modello.
Ho appena provato questo e funziona! Questo dovrebbe essere contrassegnato come la risposta accettata. –
Vecchio thread, comunque: in realtà, non è necessaria l'autenticazione. Recupera utente dall'account, setPassword, quindi user.save nel callback e il gioco è fatto. –
Autenticazione nel senso che una e-mail di 'password dimenticata' o altri mezzi per garantire all'utente è chi rivendicano – user1441287