2013-07-24 12 views

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

Właśnie wypróbowałem to i to działa! To powinno być oznaczone jako zaakceptowana odpowiedź. –

+1

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. –

+0

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

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.