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

How to Check Current Password And (If Correct) Update Password Using Passport.js Local Strategy

本文关键字:密码 如果 更新 js Passport 何使用 检查 策略      更新时间:2024-06-12

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

然而,我找不到任何使用Passport.js的好例子。有人能建议我如何在下面的用户控制器中做到这一点吗?如果Passport提供了任何帮助功能,我应该使用这些功能,以及我如何使用哈希和加盐密码?

这是我的代码:

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