2016-10-05 2 views
0

Мне нужен способ сравнить два хэшированных пароля перед выполнением почтового запроса в узле js. Хешированный пароль хранится в базе данных mongoDB. Я сузил свою ошибку до этих возможных областей.Функция сравнения bcrypt в Node.js всегда возвращает false

//Part 1 
router.post('/signIn', function (req, res) { 

if(errors){ 
    console.log(errors); 
    res.render('signIn', { 
     errors: errors 
    }); 

}else { 
    module.exports = function (passport) { 
     passport.authenticate('local',{successRedirect: '/dashboard', failureRedirect: '/', failureFlash: true}) 
    }, 
     module.exports = function (passport) { 
      passport.use(new LocalStrategy(
       function (username, password, done) { 
        User.getUserByUsername(inputUser, function (err, user) { 
         if (err) throw err; 
         if (!user) { 
          req.flash('error_msg','Unknown Username'); 
          return done(null, false); 
         } 
         User.comparePassword(inputPwd, user, hash, function (err, isMatch) { 
          if (err) throw err; 
          if (isMatch) { 
           req.flash('error_msg','Unknown Password'); 
           return done(null, user); 
          } else { 
           return done(null, false); 
          } 
         }) 
        }) 
       })) 
    }, 
     module.exports = function (passport) { 
      passport.serializeUser(function (user, done) { 
       done(null, user.id()); 
      }); 
    }, 
     module.exports = function (passport) { 
      passport.deserializeUser(function (id, done) { 
       User.getUserById(id, function (err, user) { 
        done(err, user); 
       }); 
      }); 
    }; 
    res.redirect('/users/dashboard'); 
} 

}); 

Эти детали из разных архивов.

//Part 2: 
module.exports.createUser = function (newUser, callback) { 
    bcrypt.hash(newUser.password, 10, function(err, hash) { 
     newUser.password = hash; 
     newUser.save(callback); 
    }); 
} 


module.exports.getUserByUsername = function (username, callback) { 
var query = {username: username}; 
User.findOne(query, callback); 
} 


module.exports.comparePassword = function (password, hash, callback) { 
bcrypt.compare(password, hash, function(err, isMatch) { 
    if (err) throw err; 
    callback(null, isMatch); 
    console.log(isMatch); 
}); 
} 
+2

Что-то не складывается. Ваш метод comparePassword принимает 3 параметра, но вы передаете 4 аргумента. –

+1

^что 'comparePassword (inputPwd, user, hash, function ...' вы передаете пользователя, где хэш должен быть – adeneo

ответ

0

Хорошо, вы совершили довольно много ошибок, я надеюсь, что нашел все. Я пройду через них через комментарии в коде:

function (username, password, done) { 
    // inputUser is undefined, shouldn't that be username? 
    User.getUserByUsername(inputUser, function (err, user) { 
     if (err) throw err; // you should never throw in async callbacks! use done(err) instead 
     if (!user) { 
      req.flash('error_msg','Unknown Username'); 
      return done(null, false); 
     } 
     // all your input arguments are undefined! Where does inputPwd, user and has coe from? 
     // inputPassword should be password i guess, hash idk, maybe user.hash? 
     // also your arguments are wrong 
     User.comparePassword(inputPwd, user, hash, function (err, isMatch) { 
      if (err) throw err; // again, don't throw! 
      if (isMatch) { 
       req.flash('error_msg','Unknown Password'); 
       return done(null, user); 
      } else { 
       return done(null, false); 
      } 
     }) 
    }) 
})); 

Теперь исправленная версия:

function (username, password, done) { 
    User.getUserByUsername(username, function (err, user) { 
     if (err) return done(err); 
     if (!user) { 
      req.flash('error_msg','Unknown Username'); 
      return done(null, false); 
     } 
     User.comparePassword(password, user.password, function (err, isMatch) { 
      if (err) return done(err); 
      if (isMatch) { 
       req.flash('error_msg','Unknown Password'); 
       return done(null, user); 
      } else { 
       return done(null, false); 
      } 
     }) 
    }) 
})); 
+0

Спасибо за помощь, но функция пароля сравнения по-прежнему возвращает false:/ Есть идеи? –

Смежные вопросы