2017-02-13 61 views
2

Bcrypt被拋出Incorrect arguments錯誤,我在user.js與護照bcrypt誤差和貓鼬

userSchema.methods.comparePassword = (candidatePassword, callback) => { 
    bcrypt.compare(candidatePassword, this, (err, isMatch) => { 
    console.log('candidatePassword= ', candidatePassword, '& this= ', this); 
    if (err) { return callback(err); } 
    callback(null, isMatch); 
    }); 
}; 

    /* 
    candidatePassword= bird 
    this= {} 
    this.password= undefined */ 

追溯到該函數的用戶對象是回來作爲一個空對象,因此this.password是未定義的。我假設bcrypt.compare中的this參數指向userSchema實例。該userSchema在passport.js

const passport = require('passport'); 
const ExtractJwt = require('passport-jwt').ExtractJwt; 
const JwtStrategy = require('passport-jwt').Strategy; 
const LocalStrategy = require('passport-local').Strategy; 

const User = require('../models/user'); 
const config = require('../config'); 

var localOptions = { 
    usernameField: 'email', 
}; 

// Verifies user by checking if a password matches the specified email during signin 
var localStrategy = new LocalStrategy(localOptions, function (email, password, done) { 
    User.findOne({ email:email.toLowerCase()}, function (err, user) { 
    console.log('/passport.js/localStrategy- user object: ', user) 
    if (err) { return done(err); } 
    if (!user) { return done(null, false); } 
    user.comparePassword(password, function (err, isMatch) { 
     console.log('/passport.js/localStrategy- password: ', password) 
     if (err) { return done(err); } 
     if (!isMatch) { return done(err, false); } 
     return done(null, user); 
    }); 
    }); 
}); 

// ... jwt strategy ... 

passport.use(localStrategy); 

/* 
    user object: { _id: 58a1018dc3f89eb5955b8638, 
    email: '[email protected]', 
    password: '$2a$10$lAJ9hoGKt9ggfk1TISfkOedxDIs/waLB5e4PccHAKt286XCKCY0/q', 
    __v: 0 } */ 

宣佈我不知道什麼相當的問題,因爲它似乎是一個用戶對象返回從MongoDB的加密密碼字段,並user.comparepassword()叫...

我使用相同的Schema對象也爲用戶簽名。

任何幫助/提示表示讚賞!

回答

0

您只設置模型,以便它拉入candidatePassword但從未從數據庫中找到存儲的密碼。由於這是返回一個空對象,電子郵件不匹配或密碼沒有被比較存儲。嘗試簡化comparePassword函數,並將「同步」添加到bcrypt.compare,從而不需要回調。

在車型:

userSchema.methods.comparePassword = (candidatePassword) => { 
    return bcrypt.compareSync(candidatePassword, this.password); 
}; 
+0

你也可能會丟失的序列化和反序列化部分 [結帳這個交代(http://stackoverflow.com/questions/28691215/when-is-the -serialize-and-deserialize-passport-method-called-what-do-it-exact) – Clay

+0

嗨,粘土!在passport.js中,我的代碼拉入用戶對象。 console.log語句中的文本在底部註釋。 由於我在該方法中調用user.comparePassword,我假設可以通過使用'this'作爲參數,通過bcrypt.compareSync在user.js中訪問這些變量。 是否有一個原因,我無法通過對象,一旦我已經成功拉入?謝謝 – Chris