2015-04-01 2 views
1

Я настраиваю логин, используя node.js, bcrypt, sequelize и паспорт, и я следил за документацией в Интернете, но по какой-то причине функция .compare всегда возвращает false, даже когда я знайте совпадение паролей.bcrypt-nodejs.compare всегда возвращает false

В моей модели я добавил крючок beforCreate для шифрования пароля:

beforeUpdate: function(user, options, fn) { 
    encryptPassword(user, options, fn); 
} 

функция encryptPassword:

encryptPassword = function(user, options, fn) { 
    if (!user.changed('password')) 
     return fn(); 

    bcrypt.hash(this.password, null, null, function(err, hash) { 
     if (err) return fn(err); 
     user.password = hash; 
     fn(); 
    }); 
} 

Мой контроллер, где я создаю пользователя:

User 
    .create({ 
     username: req.body.username, 
     password: req.body.password 
    }) 
    .then(function() { 
     res.json({ 
      message: 'New beer drinker added to the locker room!' 
     }); 
    }); 

Это отлично работает, пользователь хранится в моей БД с хешированным паролем.

Теперь я пытаюсь войти пользователю при помощи паспорта

passport.use(new BasicStrategy(
    function(username, password, callback) { 
     User 
      .find({ 
       where: { 
        username: username 
       } 
      }) 
      .then(function(user) { 
       // No user found with that username 
       if(!user) return callback(null, false); 

       // Make sure the password is correct 
       user.verifyPassword(password, function(err, isMatch) { 
        if(err) return callback(err); 

        // Password did not match 
        if(!isMatch) return callback(null, false); 

        // Success 
        return callback(null, user); 
       }); 
      }) 
      .catch(function(err) { 
       return callback(err); 
      }); 
    } 
)); 

Этот процесс вызывает user.verifyPassword который является instanceMethod моей модели пользователя.

verifyPassword: function(password, callback) { 
    bcrypt.compare(password, this.password, callback); 
} 

Однако обратный вызов всегда неверен независимо от того, совпадают ли пароли или нет. У кого-нибудь есть идеи, что я делаю неправильно? Я попытался переключиться на bcrypt, но я не смог его установить, потому что node-gyp rebuild всегда терпит неудачу, жалуясь, что не может найти переменную env для python, которую я установил. Плюс я не хочу иметь огромную боль в заднице, пытаясь заставить разработчиков сервера настроить сервер со всеми зависимостями и обычным обычным bcrypt.

ответ

2

При шифровании пароля я использовал this.password, который не был определен. Мне нужно было использовать user.password, чтобы получить текущий пароль.

bcrypt.hash(user.password, null, null, function(err, hash) { 
    if (err) return fn(err); 
    user.password = hash; 
    fn(); 
}); 
+0

Ты спасатель жизни. Я тоже сделал что-то вроде этого, и подумал, что виновником является Бкрипт. Благодаря! Также вы должны отметить это как ответ, чтобы закрыть вопрос. – Rafael

0

Вы фактически не передаете пароль функции verifyPassword.

user.verifyPassword(password, function(err, isMatch) { 
    ...    ^^^^^^^^ 
});` 

что переменная пароля фактически не определена. Когда вы находитесь в функции .then(), у вас есть доступ к объекту, который возвращается из базы данных. Является ли это единственным результатом или результирующим набором.

user.verifyPassword(user.password, function(err, isMatch) { ... }); 
        ^^^^^^^^^^^^^ 

Вы будете иметь доступ к данным внутри объекта, который вы получите обратно от .findAll() запроса.

Надеюсь, это поможет.

+0

переменная пароль определяется несколько строк в начале passport.use ... Если бы я сделал, как вы предложили и использовали значение, возвращенное в базе данных я бы сравнение зашифрованного значения, хранящегося в БД против зашифрованное значение из базы данных, которое всегда возвращает false. Мне нужно сравнить значение, введенное в логин и зашифрованное значение из базы данных, которую я делаю. passport.use (new BasicStrategy ( ) \t Функция (имя пользователя, пароль, обратный вызов) { – efarley

+0

О, моя ошибка, вы правы в сравнении значения из баз данных с самим собой. Проблема заключается в области, я думаю. 'variable, определенная ранее, не имеет области действия в функции' .then() ', где вы пытаетесь ее использовать. – mikemimik

+0

Я уже подтвердил, что это не так.Я использую Postman для вставки точки останова в эту строку и подтвердил, что значение переменной пароля - это значение, введенное пользователем для их пароля. – efarley

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