2013-12-09 27 views
2

我需要編寫普通的代碼來檢查通過表單提交的當前用戶密碼值,以查看它是否與數據庫中的現有密碼匹配,以及如果是,請將密碼更新爲通過同一表單提交的新密碼值。如何檢查當前密碼和(如果正確)使用Passport.js本地策略更新密碼

但是,我找不到任何使用Passport.js的方法。任何人都可以建議我如何在下面的用戶控制器中執行此操作,如果有護照提供的任何幫助函數用於此目的,以及如何使用哈希和密碼來執行此操作?

這裏是我的代碼:

// Form Submitted 
    req.body = { 
    _id: '5294198b7b35ad2794000001', 
    email: '[email protected]', 
    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); 
      }); 
     } 
    )); 
    }; 

回答

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

謝謝,這工作:) – ac360

相關問題