NodeJS: bcrypt возвращает false, даже если пароль правильный - PullRequest
0 голосов
/ 12 апреля 2020

У меня проблемы с частью bcrypt.compare моего кода. Мой маршрут может иметь sh пароль и хранить пароль в базе данных. База данных может хранить 255 символов, и я убедился, что пароль имеет длину 60 символов. Каждый раз, когда я сравниваю пароль с хешированным паролем на БД, я получаю ложное сообщение от bycrypt.compare.

Кто-нибудь сталкивался с этим и знает, что я могу делать неправильно?

Auth Маршрут для создания пользователя в базе данных:

    app.post('/register/local', async (req, res) => {
    const hashedPassword = await bcrypt.hash(req.body.password, 10) || undefined
    const existingLocalUser = await db.User.findOne({ where: { email: req.body.email } }) || undefined
      if (!existingLocalUser) {
          try {
            const newUser = await db.User.create({
                given_name: req.body.given_name,
                family_name: req.body.family_name,
                email: req.body.email,
                password: hashedPassword,
              }
              )
              res.redirect('/login')
          } catch {
              res.redirect('/register')
          }
      } else if (existingLocalUser.dataValues.google_id) {
        const updateUser = await db.User.update(
            { password: hashedPassword },
            { where: { email: req.body.email } }
          )
        } else {
            console.log("You already have an account. Please login.")
            res.redirect('/login');
        }
})

Локальная стратегия из паспорта:

passport.use(new LocalStrategy( async (username, password, done) => {
  const existingLocalUser = await User.findOne({ where: { email: username }})
      if (!existingLocalUser) {
        console.log("No user exisits")
        return done(null, false)
      }
          console.log("password", password)
          console.log("existingLocalUser.password", existingLocalUser.password)
          await bcrypt.compare(password, existingLocalUser.dataValues.password, function(error, result) {
            if (error) {
              return done(error)
            } else if (result) {
              return done(null, existingLocalUser)
            } else {
              return done(null, false)
            }
          })
  }
));

Ответы [ 3 ]

0 голосов
/ 12 апреля 2020

Как правильно заметил @cristos, проблема может заключаться в том, что вы смешиваете асинхронные / ожидающие и обратные вызовы. Придерживайтесь одного шаблона. Вот как ваш код будет с async / await,

try {
  const result = await bcrypt.compare(password, existingLocalUser.password);

  if (result) {
    return done(null, existingLocalUser);
  } else {
    return done(null, false);
  }
} catch (error) {
  return done(error);
}


Также на другом примечании, вы уверены, что сравниваете правильные значения? Исходя из предоставленного вами примера кода, я вижу, что вы регистрируетесь,

console.log("password", password)
console.log("existingLocalUser.password", existingLocalUser.password)

Однако значения, сравниваемые в bcrypt.compare(), отличаются,

bcrypt.compare(password, existingLocalUser.dataValues.password)
0 голосов
/ 12 апреля 2020

Я понял, почему он не работает ... React или Redux маскировали пароль звездочками, поэтому изменили его на цепочку звездочек, которая хэшируется.

0 голосов
/ 12 апреля 2020

 bcrypt.compare(password, existingLocalUser.password, function(error, result) {
            if (error) {
              return done(error)
            } else if (result) {
              return done(null, existingLocalUser)
            } else {
              return done(null, false)
            }
          })

Вы пытаетесь использовать обратный вызов и ожидание вместе, любезно удалите ожидание и придерживайтесь обратных вызовов, или вы реорганизуете и используете asyn c - только ожидание

...