使用Passport和密码加密的NodeJS LDAP身份验证

时间:2014-05-28 05:29:43

标签: node.js authentication encryption passport.js

我正在查看PassportJS进行身份验证,并拥有一个包含用户名和密码的登录表单。但是,如果我查看文档,我会看到密码以明文形式传递。这意味着如果有人使用console.log(密码),密码将是可见的。如何确保登录表单提交的密码已加密?

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
         if (!user) {
           return done(null, false, { message: 'Incorrect username.' });
         }
      if (!user.validPassword(password)) {
         return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

1 个答案:

答案 0 :(得分:1)

1)从客户端到服务器

使用SSL。

2)从服务器到磁盘/数据库

创建密码时,首先将其哈希并将哈希保存到磁盘。

稍后,在验证用户时,将提交的密码的哈希值与磁盘上的哈希值进行比较。

如果使用bcrypt,则从passport-local examples看起来会像这样:

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

注意:除了护照本地之外,您还需要使用bcrypt或其他一些加密模块......但这并不是非常复杂,护照本地仓库中的示例几乎可以提供给您所有人我需要开始。