2013-07-24 70 views

回答

19

查看源也被添加到所謂setPassword架構的功能。 我相信在驗證後,您可以調用它來更改用戶的密碼。

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

剛試過這個,它的工作原理!這應該被標記爲接受的答案。 –

+1

反正老線程:實際上,你不需要認證。從帳戶中檢索用戶,設置密碼,然後在回調中輸入user.save,就完成了。 –

+0

驗證在一個'忘記密碼的電子郵件或確保用戶的一些其他方式的感覺是,他們聲稱 – user1441287

6

很好的回答,但對於那些誰來自MEAN堆棧(採用護照的地方,沒有護照,本地貓鼬):

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

因此,這將改變通:

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

無需驗證。檢索從使用findByUsername()方法,其通過護照和本地貓鼬放置在模型帳戶的用戶,然後運行setPassword(),然後user.save()在回調。

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

我撥打的用戶sanitizedUser(),因爲我已經配置護照本地貓鼬有來無回用findByUsername()密碼或鹽田和模型護照選項。