2013-07-24 2 views

risposta

19

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); 
     }); 
    }); 
}; 
+1

Ho appena provato questo e funziona! Questo dovrebbe essere contrassegnato come la risposta accettata. –

+1

Vecchio thread, comunque: in realtà, non è necessaria l'autenticazione. Recupera utente dall'account, setPassword, quindi user.save nel callback e il gioco è fatto. –

+0

Autenticazione nel senso che una e-mail di 'password dimenticata' o altri mezzi per garantire all'utente è chi rivendicano – user1441287

6

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)... 
}); 
9

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.