2015-12-18 3 views
-1

bcrypt.compare() всегда возвращается с этим кодом в пользовательской модели. Это с помощью bcrypt-nodejs.Bcrypt compare всегда возвращает false

User.pre('save', function (callback) { 
    this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10)) 
    this.token = jwt.sign(this.email, process.env.JWT_SECRET) 
    callback() 
}) 

User.methods.verifyPassword = function (password) { 
    const self = this 

    return Q.Promise((resolve, reject) => { 
    bcrypt.compare(password, self.password, (error, isMatch) => { 
     if (error) reject(new Error("Error checking user password.")) 
     resolve(isMatch) 
    }) 
    }) 
} 

Я вижу, что в базе данных появляется хеш. Я вижу, что этот правильный пароль входит в функцию verifyPassword.


EDIT: Проблема, кажется, что .pre('save', ... происходит два раза подряд. Таким образом, новый хешированный пароль снова хешируется.

ответ

0

Вот рабочая версия вашего кода. Я не уверен, что все происходит за кулисами с помощью ваших методов, поэтому я сделал эту часть.

Чтобы доказать это, добавьте это в файл index.js и запустите его с помощью «node index.js».

Он будет выдавать это:

We got a match! true or false? true 

Вот код.

var bcrypt = require('bcrypt'); 
var Q = require('Q'); 
var salt = bcrypt.genSaltSync(10); 


process.env.JWT_SECRET = 'Much_Secretive,_Such_Obscure'; 

function SuperUser() { 
    this.pre = function (password, callback) { 
    this.password = bcrypt.hashSync(password, salt); 
    callback.call(this, password); 
    }; 
    this.methods = {}; 
} 

var User = new SuperUser(); 

User.methods.verifyPassword = function (password) { 
    const self = this; 

    return Q.Promise((resolve, reject) => { 
    bcrypt.compare(password, self.password, (error, isMatch) => { 
     if (error) reject(new Error("Error checking user password.")); 
     console.log("We got a match! true or false? " + isMatch); 
     resolve(isMatch); 
    }); 
    }); 
}; 

User.pre('save', function (password) { 
    this.methods.verifyPassword.call(this,password); 
}); 

Не видя ваше полное осуществление его трудно, чтобы знать наверняка, но, вероятно, ссылка на «это», который не «это» можно было бы ожидать, что это будет.

Я использую функцию.call пару раз, чтобы обойти это.

0

Решение было if (!this.isModified('password')) return callback(), как показано ниже.

User.pre('save', function (callback) { 
    if (!this.isModified('password')) return callback() 

    this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10)) 
    this.token = jwt.sign(this.email, process.env.JWT_SECRET) 
    callback() 
}) 

Это потому, что это срабатывает более одного раза в процессе сохранения. Таким образом, это было эффективно хеширование пароля, а затем во втором раунде хеширование хэша.

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