Как хэшировать пароль перед сохранением в БД, чтобы быть совместимым с паспортным модулем (passport local)

Я использую passport-локальную стратегию passport для аутентификации. На моем экспресс-сервере я получаю запрос на регистрацию, и я должен сохранить пароль в БД для нового пользователя. Но я должен хэшировать пароль перед сохранением в БД.

но я не уверен, как, чтобы обсудить это, так как паспорт будет проверять подлинность пользователей с помощью хэширования логин пароль к зашифрованным паролем из БД. Как я должен хэшировать пароли ?

Я использую этот модуль.

3 ответов


passport-local не хэширует ваши пароли-это передает учетные данные для проверки обратного вызова для проверки, и вы позаботитесь об обработке учетных данных. Таким образом, вы можете использовать любой алгоритм хэша, но я считаю bcrypt самые популярные.

вы хэш пароля в ваш обработчик регистра:

app.post('/register', function(req, res, next) {
  // Whatever verifications and checks you need to perform here
  bcrypt.genSalt(10, function(err, salt) {
    if (err) return next(err);
    bcrypt.hash(req.body.password, salt, function(err, hash) {
      if (err) return next(err);
      newUser.password = hash; // Or however suits your setup
      // Store the user to the database, then send the response
    });
  });
});

затем в вашем обратном вызове проверки вы сравниваете предоставленный пароль с хэшем:

passport.use(new LocalStrategy(function(username, password, cb) {
  // Locate user first here
  bcrypt.compare(password, user.password, function(err, res) {
    if (err) return cb(err);
    if (res === false) {
      return cb(null, false);
    } else {
      return cb(null, user);
    }
  });
}));

вы пробовали это?

https://www.npmjs.com/package/passport-local-authenticate

var auth = require('passport-local-authenticate');

auth.hash('password', function(err, hashed) {
  console.log(hashed.hash); // Hashed password
  console.log(hashed.salt); // Salt
});

auth.hash('password', function(err, hashed) {
  auth.verify('password', hashed, function(err, verified) {
    console.log(verified); // True, passwords match
  ));
});

auth.hash('password', function(err, hashed) {
  auth.verify('password2', hashed, function(err, verified) {
    console.log(verified); // False, passwords don't match
  ));
});

почему мы должны идти на алгоритм хэширования, когда паспорт уже предоставил его для нас? Я имею в виду, что нам просто нужно подключить passport-local-mongoose к нашей пользовательской схеме, например: UserSchema.plugin(passportLocalMongoose) и затем, внутри маршрута регистра мы просто говорим passportLocalMongoose чтобы сделать хеширование для нас, используя:

User.register(new User({username:req.body.username}), req.body.password,function(err,newUser)
{ 
    if(err){
        something
    }else{
        something
    }
)

делая выше, нам не нужно заботиться о хэшировании, и это будет сделано для нас. Пожалуйста, поправьте меня, если я ошибаюсь или неправильно понял ваш вопрос.