2016-06-15 28 views
0

私はpassport-localを使用しています。私はすでにmongoデータベースにパスワードをハッシュしています。なぜ私のbcrypt.compare()が正しく動作していないのか分かりません。それは 'cbは関数ではない'と言いますが、それはそうです。私は、コールバックをUserスキーマに保存するのではなく、同じファイルに変数として保存しました。誰もが前にこの問題を横断したり、私のコード内の任意のエラーを参照してください?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- a-function-error#)。 –

0

だからbcrypt.compareに苦しんで数時間後、私はちょうど私のデータベースをクリアし、最初から新しいユーザーを作成することを決めました。私はbcrypt.compareSync()を使用して終了し、最終的に私のパスワードを確認しました!だから、あなたのデータベースにユーザー/その他のものを追加する前に、あなたのモデルに定義されたすべてのメソッドがあることを確認してください。私はすでにcompare関数を追加したと思ったが、私は間違っていたと思う。あなたの助けをありがとう!

0

このようなことが発生しました。これは、非同期処理と、すべてのコードがすでに約束(user.findOne())の.then()ハンドラに入っているという事実と関係しています。約束とコールバックパターンを混ぜることは、一般的には良い考えではありません。

私がやったことは、約束事で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*/) 
})) 

あなたはまた、あなたの.then()の最後にだけ

​​

に試みることができるが、私は」 dは上記のコードのように.then()の外でcomparePasswordを宣言します。

関連する問題