【发布时间】:2015-01-18 14:49:52
【问题描述】:
我正在使用 node-bcrypt 和 PostgreSQL(通过 Sequelizejs 散列和保存密码。
用户的密码在 beforeValidate 钩子中散列,如下所示:
beforeValidate: function(user, model, cb) {
bcrypt.hash(user.password, 10, function(err, hash) {
if ( err ) { throw err; }
user.password = hash;
cb(null, user);
});
}
用户模型上存储哈希的列定义为:
password: { type: DataTypes.STRING, allowNull: false }
当用户登录时(我使用Passport进行身份验证),函数如下所示:
passport.use(new LocalStrategy(function(username, password, done) {
models.User.find({ username: username }).then(function(retrievedUser) {
if ( !_.isEmpty(retrievedUser) ) {
retrievedUser.verifyPassword(password, function(err, result) {
if ( err || !result ) {
return done(null, false, { message: 'Incorrect password.' });
} else {
return done(null, retrievedUser);
}
});
} else {
return done(null, false, { message: 'User could not be found at that username.' });
}
}).catch(function(err) {
return done(err);
});
}));
正确检索用户。
以及在用户模型上定义的比较:
instanceMethods: {
verifyPassword: function(password, cb) {
bcrypt.compare(password, this.password, cb);
}
}
如果密码仅包含字母和/或符号,则验证通过。但是,任何带有数字的密码都不会通过比较。有什么想法吗?
【问题讨论】:
-
你确定数据库中的哈希值是正确的吗?也许您在创建哈希之前不小心将密码小写了?
-
@loganfsmyth 只是仔细检查以确保这不是问题,并且看起来大写字母实际上可以正常工作。问题只是符号和数字(编辑过的原始帖子)
-
您使用的是哪个模块?有许多 bcrypt 实现。
-
@AaronDufour 我正在使用在我的原始帖子here 中链接的实现。我相信这是官方的节点实现?
-
我认为这与 bcrypt 无关。由于 JS 中的自动类型转换,我假设您的字母密码仅匹配。如果您能提供在这两种情况下提供给哈希调用的准确输入,将会很有帮助。
标签: javascript node.js express bcrypt