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

时间:2013-12-09 20:56:31

标签: javascript node.js express passport.js

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

然而,我找不到任何使用Passport.js如何做到这一点的好例子。任何人都可以建议我如何在我的用户控制器中执行此操作,如果我应该使用护照提供的任何帮助函数,以及如何使用散列和盐渍密码执行此操作?

这是我的代码:

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

1 个答案:

答案 0 :(得分:2)

哈希和盐渍密码

full example on 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);
        });
};