2016-06-15 5 views
0

Я использую паспорт-локальный, и я уже hashed мои пароли в моей базе данных монго. Я не могу понять, почему мой bcrypt.compare() работает неправильно. В нем говорится: «cb не является функцией», но это так. Я просто сохранил обратный вызов как переменную в том же файле, а не сохранил ее в моей схеме пользователя. Кто-нибудь сталкивался с этой проблемой раньше или видел какие-либо ошибки в моем коде?bcrypt.compare cb не является функцией ошибки

passport.use(new LocalStrategy((username, password, done) => { 
User.findOne({ username: username }).exec().then((user, err) => { 
if (err) return done(err) 
if (!user) return done(null, false, { message: 'Incorrect username.' }) 

const comparePassword = function (candidatePassword, hashedPassword, cb) { 
    bcrypt.compare(candidatePassword, hashedPassword, function (err, isMatch) { 
    if (err) return cb(err) 
    return cb(null, isMatch) 
    }) 
} 
comparePassword(password, user.password, function (err, isMatch) { 
    if (err) return done(err) 
    if (!isMatch) return done(null, false, { message: 'Incorrect password.' }) 
    return done(null, user) 
}) 
}) 
})) 
+1

Почему вы используете эту отдельную функцию comparePassword вообще (вместо прямого вызова 'bcrypt.compare')? – Bergi

+2

Это не связано, но для целей безопасности вы обычно не должны различать неправильное имя пользователя и неверный пароль. Просто верните одно и то же общее сообщение, таким образом злоумышленник не будет знать, нашли ли они правильное имя пользователя или нет. Это все мои 2 цента. – mscdex

+0

Я не могу заставить его работать только с bcrypt.compare:/ –

ответ

-1

Код выглядит хорошо для меня. Хотя я не проверял.

Содержит ли ваше сравнение паролей aSync? Считаете ли вы использование bcrypt.compareSync?

Пример:

MyPasswordTool.prototype.validateHashedPassword = function(challlenger, hashedPassword) { 
    return bcrypt.compareSync(challlenger, hashedPassword); 
}; 
+0

Для пояснений просьба [добавить комментарий] (http://stackoverflow.com/questions/37824613/bcrypt-compare-cb-is-not- а-функция ошибки #). –

0

Так после нескольких часов боролись с bcrypt.compare, я просто решил очистить свою базу данных и создавать новые пользователь с нуля. Я закончил использовать bcrypt.compareSync(), и он, наконец, проверил мои пароли! Поэтому убедитесь, что у вас есть все ваши методы, определенные на вашей модели, прежде чем вы добавите пользователей/что-то в вашу базу данных. Я думал, что уже добавил функцию сравнения, но, думаю, я ошибся. Спасибо за всю твою помощь!

0

Раньше я сталкивался с чем-то подобным. Это связано с обработкой async и тем фактом, что весь ваш код уже находится в обработчике .then() обещания (user.findOne()). Обычно не рекомендуется смешивать обещания и шаблон обратного вызова.

То, что я закончил, это обернуть мою функцию comparePassword в обещание, а затем включить его в цепочку обещаний. Мой код был совсем другой, но в вашем случае это будет выглядеть примерно так:

passport.use(new LocalStrategy((username, password, done) => { 

function comparePassword(candidatePassword, hashedPassword) { 
return new Promise((resolve, reject) => { 
    bcrypt.compare(candidatePassword, hashedPassword, 
    (err, isMatch) => { 
     if (err) return reject(err); 
     else if (!isMatch) reject(new Error('Incorrect Password')); 
     else resolve(); 
    }); 
    }); 
}) 

User.findOne({ username: username }).exec() 
.then((user, err) => { 
if (err) return done(err) 
if (!user) return done(null, false, { message: 'Incorrect username.' }) 
return comparePassword(password, user.password) 
}) 
.then(/*do stuff if password is a match*/) 
.catch(/*do stuff iff not a match*/) 
})) 

Вы также можете попробовать только

return comparePassword(password, user.password, function (err, isMatch) { 

в конце вашего .then(), и я d объявить comparePassword за пределами .then(), как в моем коде выше.

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