2013-07-24 15 views

Antwort

19

Mit Blick auf die Quelle gibt es eine Funktion, die dem Schema namens setPassword hinzugefügt wird. Ich glaube, dass Sie nach der Authentifizierung anrufen können, um das Passwort für den Benutzer zu ändern.

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

Ich habe es einfach versucht und es funktioniert! Dies sollte als akzeptierte Antwort markiert werden. –

+1

Alter Thread, wie auch immer: Eigentlich brauchst du keine Authentifizierung. Rufen Sie den Benutzer aus dem Konto, setPassword, dann user.save im Callback ab, und Sie sind fertig. –

+0

Authentifizierung in dem Sinne, dass eine "Passwort vergessen" E-Mail oder ein anderes Mittel zur Gewährleistung der Benutzer ist, wer sie beanspruchen – user1441287

6

Gute Antwort, aber für diejenigen, die aus dem MEAN Stapel kommen (verwendet Pass-lokal, nicht Pass-local-Mungo):

//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; 
}); 

So würde dies den Pass ändern:

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

Keine Authentifizierung erforderlich. Benutzer aus dem Konto mit findByUsername() Methode abrufen, die auf dem Modell von Pass-Local-Mungo platziert wurde, führen Sie dann setPassword(), dann user.save() im Rückruf.

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

Ich nenne den Benutzer sanitizedUser() weil ich Pass-local-Mungo konfiguriert haben, dass das Passwort nicht oder Salzfelder zurückkehren findByUsername() und die Passoptionen im Modell.