【问题标题】:How to validate password in passport-local-mongoose如何验证passport-local-mongoose中的密码
【发布时间】:2017-09-25 06:11:21
【问题描述】:

我正在使用带 passport-local-mongoose 的护照来注册和登录用户。

这是我用来登录用户的代码:

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

除了 user.validPassword,一切都很有趣。 我在用户模型中定义它:

userSchema.methods.validPassword = function(password) {
    // What should I write here?
};

由于哈希密码将被保存到数据库中,我不知道如何验证密码。

例如,这是一个保存到数据库中的用户{

    "_id" : ObjectId("5901d55c30967512407cdcd0"),
    "salt" : "7e76e1de50856c0a0e219c48609e0c86e8036bd4aa48e5161635f88dd19b695b",
    "hash" : "eb78dcb7109454457b0709b6b49f322c69454930e3a6ca90621b1f38d4a068c46a34d0af8ba4f3cb3c3f9c8a30889f54028f182e1a038ab5d642e408117a93b34a519e594f62ea2209ef350f17d388e07476c021fdd66979e5752305b2f41571c830c4e03300cfbddce70443debee06d921900e1f7b9f024ea8d875553f01989e9267b01cc7e9da70f5ee39085527a55c8b6a9f5c7f21e07166797d5446322f52ec79c8e6bfd3e31d5f3953d86a13775da09f7ac3a5a85e5342cd35324bc66055030ca738fa657c50ec4368fe1fd4a26448b460996dc85ddebf90f92796f2b1adf9b905e0590efcadd8326053e354afcc144a155ca7ba1a0f1269cd2c5edec9ef4c643e5ca58310bf3283ed21bb94da6b22c113d19baf091f62bf1776fdcd4bca572cc114ec991d780c18524aad34988d0045f9a1d35e6cda4a6be337d7c8dce8256a240ecac9c7f4ac6c231a3c258f3660b5dd6daf4e67f878fbd9af9e52f9d36266828f564e6ac86f3aed98f7af0bb39017f6080e41cb49237bec6eae77253200750be14e53e79e3fc8d29a3a5cc774905e47bc8df6e5ae9f1b38d9ef738a7cc7890aba4bbea757c694df5faaeed2c692adcc9d8bb0242a5ced98c6a015f5b0b3b475b4a78767a1e9e3c6c9f1bc1be42a835f9e54de3ce223f6190ed457ea972ee4be6f506fd3995411d05247b7102c396c3a16b0d4c26664833d2224191cc",
    "username" : "stve45",
    "email" : "stebe@companycom",
    "name" : "Steve",
    "__v" : 0
}

我也使用简单的passport-local-authenticate。

任何帮助将不胜感激,非常感谢。

【问题讨论】:

    标签: node.js mongodb passport.js passport-local


    【解决方案1】:

    如果您使用的是 passport-local-mongoose,它会通过获取您的密码来创建一个盐和哈希值。这就是为什么在您的用户架构中您不必保存密码字段的原因。

    但是 passport-local-mongoose 的本地策略与普通的护照本地策略有很大不同。就像

    passport.use(new LocalStrategy(User.authenticate()));
    

    这将检查输入的密码,并使用盐和哈希进行检查。

    您编写的代码是针对普通本地策略的。如果您使用的是 passport-local-mongoose,那不应该使用。

    这就是您应该如何序列化和反序列化 passport-local-mongoose:

     passport.serializeUser(User.serializeUser());passport.deserializeUser(User.deserializeUser());
    

    【讨论】:

      【解决方案2】:

      我假设您有一种在保存之前生成盐和哈希的方法。

      在您的 validPassword 方法中,您调用相同的方法并比较用户密码 inout 的结果,并将其与您在 DB 中的结果进行比较/如果匹配,那么您很好。

      作为替代方案,有一些库来管理它。我使用bcrypt。在此处查看示例:

      adminSchema.pre('save', function(next) {
          var user = this;
      
          // only hash the password if it has been modified (or is new)
          if (!user.isModified('password')) {
              return next();
          }
      
          // password changed so we need to hash it (generate a salt)
          bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
              if (err) {
                  return next(err);
              }else{
                  // hash the password using our new salt
                  bcrypt.hash(user.password, salt, function(err, hash) {
                      if (err) { return next(err); }
                      // override the cleartext password with the hashed one
                      user.password = hash;
                      next();
                  });
              }
          });
      });
      
      
      adminSchema.methods.comparePassword = function(password, cb) {
          console.log('comparing password');
          bcrypt.compare(password, this.password, function(err, isMatch) {
              cb(err, isMatch);
          });
      };
      

      【讨论】:

        【解决方案3】:

        这是一个示例代码。请注意,User.findOne() 函数远未完成。它只是为了让您了解此代码相对于您的代码的位置,并让您了解应该进行哪些更改制作。

          passport.use('local.signup', new LocalStrategy({
           usernameField:'email', //it can be email or whatever one chooses
           passwordField:'password',
           confirmField:'password',
           passReqToCallback:true//here is the trick.u pass everything you want to do to a callback
           },function (req,email, password, done) {
              req.checkBody('email','Invalid e-mail address...').notEmpty().isEmail().normalizeEmail();//validate email
              req.checkBody('password','Invalid password...').notEmpty().isLength({min:8});//validate pass to be min 8 chars but you can provide it with checking for capital letters and so on and so forth
              var errors = req.validationErrors();
              if(errors){
              var messages = [];
              errors.forEach(function (error) {
              messages.push(error.msg)
             });
            return done(null, false, req.flash('error', messages))
            }
        
         User.findOne({ email: req.body.email }, function (err, user) {
        
        // Make sure user doesn't already exist
           if (user) return done(null, false, {message:'The email address you have 
           entered is already associated with another account.'
          });
        

        【讨论】:

          猜你喜欢
          • 2013-07-23
          • 2014-07-21
          • 2015-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-15
          • 2020-02-23
          • 2021-10-13
          相关资源
          最近更新 更多