如何检查当前密码和(如果正确)使用Passport.js本地策略更新密码

我需要编写普通的代码来检查通过表单提交的当前用户密码值,看看它是否与数据库中的现有密码匹配,如果是,请将密码更新为通过同一表单提交的新密码值。

然而,我无法find任何使用Passport.js的方法。 任何人都可以build议如何我可以做到这一点在我的用户控制器下面,如果有任何帮助function提供的护照,我应该使用这个,以及如何做到这一点哈希和咸的密码?

这是我的代码:

// Form Submitted req.body = { _id: '5294198b7b35ad2794000001', email: 'testusera1@abc.net', name: 'John Smith', provider: 'local', username: 'ab123', current_password: 'currentpassword', new_password: 'newpassword' } // Route app.put('/users/me', users.update); // Controller var mongoose = require('mongoose'), User = mongoose.model('User'), _ = require('underscore'), passport = require('passport'), LocalStrategy = require('passport-local').Strategy; exports.update = function(req, res) { var user = req.user user = _.extend(user, req.body); user.save(function(err) { if(err) { console.log(err) }; res.jsonp(user); }); }; // Passport Config File module.exports = function(passport) { //Serialize sessions passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findOne({ _id: id }, function(err, user) { done(err, user); }); }); //Use local strategy passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function(email, password, done) { User.findOne({ email: email }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Unknown user' }); } if (!user.authenticate(password)) { return done(null, false, { message: 'Invalid password' }); } return done(null, user); }); } )); }; 

哈希和盐渍密码

在github上的完整例子

 // Bcrypt middleware userSchema.pre('save', function(next) { var user = this; if(!user.isModified('password')) return next(); bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { if(err) return next(err); bcrypt.hash(user.password, salt, function(err, hash) { if(err) return next(err); user.password = hash; next(); }); }); }); // Password verification userSchema.methods.comparePassword = function(candidatePassword, cb) { bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { if(err) return cb(err); cb(null, isMatch); }); };