Bcrypt在登录

时间:2018-03-08 13:34:35

标签: mongodb express mongoose passwords bcrypt

我知道这个问题已被多次询问,但我无法在这里或在github上找到我的问题的答案。我有一个登录处理程序,它将db中的哈希密码与登录时用户键入的密码进行比较。 bcrypt.compare几乎总是返回false。我说几乎是因为有时它只是开始工作,它总是在我注册用户后工作。我试图找到我的代码有什么问题,但无法弄明白。任何帮助都非常感谢。

mongoose pre save

userModel.schema.pre('save', function(next) {
  let user = this;
  bcrypt.hash(user.password, 10, null)
    .then(hash => {
      console.log(hash)
      user.password = hash;
      user.confirmPassword = hash;
      next();
    })
    .catch(err => res.sendStatus(404));
});

登录处理程序

exports.loginUser = (req, res) => {
  let user = new User.model(req.body);
    User.model
      .find({email: user.email})
      .exec()
      .then(users => {
        if (!users.length) { 
          res.status(401).json({
            message: "Auth failed - user does not exist"
          });
        } else {
          bcrypt
          .compare(req.body.password, users[0].password)
          .then(result=> {
            console.log(user.password, users[0].password)
            console.log(bcrypt.hashSync(req.body.password, 10))
            if (result) {
              const token = 
                jwt
                  .sign({ email: users[0].email, id: users[0]._id },
                  'secretKey', { expiresIn: "1h"});
              res.status(200).json({
                message: "Auth success - logged in",
                token,
                users
              });
            } else {
              res.json('not working');
            }
          })
          .catch(err => res.status(401).json({message: "Auth failed"}));
        }     
      });
};

注册处理程序

exports.registerUser = (req, res) => {
  let user = new User.model(req.body);
  if(user.email) {
    User.model
      .find({email: user.email})
      .exec()
      .then(docs => {
        if (!docs.length) { 
          if (user.password !== user.confirmPassword) {
            return res.status(404).json('passwords do not match');
          }
          user.save(function (err, user) {
            if (err) return (err);
          });
          console.log('user saved');
          res.sendStatus(200); 
        } else {
          res.status(404).json('user exists');
        }      
      })
      .catch(err => res.sendStatus(404).json(res.body));
    } else {
      res.status(404).json('user name required');
    }
};

1 个答案:

答案 0 :(得分:0)

问题可能是每次保存用户时都会生成新密码。你应该跳过这个。

userModel.schema.pre('save', function(next) {
  let user = this;
  if(!user.isModified("password")) return next();

  bcrypt.hash(user.password, 10, null)
    .then(hash => {
      console.log(hash)
      user.password = hash;
      user.confirmPassword = hash;
      next();
    })
    .catch(err => res.sendStatus(404));
});

虽然在黑暗中只是一枪。在假设情况发生变化的情况下再次调用,因为你说它有时会起作用。