2013-07-24 50 views

Trả lời

19

Nhìn vào nguồn có một hàm được thêm vào lược đồ được gọi là setPassword. Tôi tin rằng sau khi xác thực bạn có thể gọi nó để thay đổi mật khẩu cho người dùng.

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

Chỉ cần thử điều này và nó hoạt động! Điều này sẽ được đánh dấu là câu trả lời được chấp nhận. –

+1

Chủ đề cũ, dù sao: thực sự, bạn không cần xác thực. Truy xuất người dùng từ tài khoản, setPassword, sau đó user.save trong gọi lại, và bạn đã hoàn tất. –

+0

Xác thực theo nghĩa là email 'quên mật khẩu' hoặc một số phương tiện khác để đảm bảo người dùng là người mà họ khiếu nại – user1441287

6

câu trả lời tốt, nhưng đối với những người đến từ các MEAN ngăn xếp (sử dụng hộ chiếu cục bộ, không hộ chiếu cục bộ-cầy mangut):

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

Vì vậy, điều này sẽ thay đổi pass:

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

Không cần xác thực. Truy xuất người dùng từ tài khoản bằng cách sử dụng phương thức findByUsername(), được đặt trên mô hình bằng hộ chiếu-local-mongoose, sau đó chạy setPassword(), sau đó user.save() trong gọi lại.

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

tôi gọi người dùng sanitizedUser() vì tôi đã cấu hình hộ chiếu cục bộ-cầy mangut để không trở về các lĩnh vực mật khẩu hoặc muối sử dụng findByUsername() và các tùy chọn hộ chiếu trong mô hình.