bcrypt.compare()
在用户模型中使用此代码时总是返回false。这是使用bcrypt-nodejs。
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
功能。
编辑:问题似乎是.pre('save', ...
连续出现两次。所以新的哈希密码再次被哈希。
答案 0 :(得分: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);
});
如果没有看到您的全面实施,很难确定,但可能会提到这个'这个'那不是'这个'你会期待它。
我使用function.call几次来解决这个问题。
答案 1 :(得分: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()
})
这是因为它在保存过程中不止一次触发。所以它有效地散列了密码,然后在第二轮中散列哈希值。