bcrypt-nodejs.compare总是返回false

时间:2015-04-01 19:07:44

标签: node.js bcrypt passport-local

我正在使用node.js,bcrypt,sequelize和passport设置登录,我已经在线跟踪文档但由于某种原因,即使我知道密码匹配,.compare函数也会返回false。 / p>

在我的模型中,我添加了一个beforCreate挂钩来加密密码:

beforeUpdate: function(user, options, fn) {
    encryptPassword(user, options, fn);
}

encryptPassword功能:

encryptPassword = function(user, options, fn) {
    if (!user.changed('password'))
        return fn();

    bcrypt.hash(this.password, null, null, function(err, hash) {
        if (err) return fn(err);
        user.password = hash;
        fn();
    });
}

我创建用户的控制器:

User
    .create({
        username: req.body.username,
        password: req.body.password
    })
    .then(function() {
        res.json({
            message: 'New beer drinker added to the locker room!'
        });
    });

效果很好,用户使用哈希密码存储在我的数据库中。

现在我尝试使用护照

登录用户
passport.use(new BasicStrategy(
    function(username, password, callback) {
        User
            .find({
                where: {
                    username: username
                }
            })
            .then(function(user) {
                // No user found with that username
                if(!user) return callback(null, false);

                // Make sure the password is correct
                user.verifyPassword(password, function(err, isMatch) {
                    if(err) return callback(err);

                    // Password did not match
                    if(!isMatch) return callback(null, false);

                    // Success
                    return callback(null, user);
                });
            })
            .catch(function(err) {
                return callback(err);
            });
    }
));

此过程调用user.verifyPassword,它是我的用户模型的instanceMethod。

verifyPassword: function(password, callback) {
    bcrypt.compare(password, this.password, callback);
}

然而,无论密码是否匹配,回调始终为false。有没有人有任何想法我做错了什么?我试图切换到bcrypt,但我无法安装它因为node-gyp重建总是失败抱怨它无法找到我已经安装的python的env变量。另外,我不想让屁股试图让服务器开发人员设置一个具有普通bcrypt所有依赖关系和服务器的服务器。

2 个答案:

答案 0 :(得分:2)

加密密码时,我使用的是未定义的.password。我需要使用user.password来获取当前密码。

bcrypt.hash(user.password, null, null, function(err, hash) {
    if (err) return fn(err);
    user.password = hash;
    fn();
});

答案 1 :(得分:0)

您实际上并未将密码传递给verifyPassword函数。

user.verifyPassword(password, function(err, isMatch) {
   ...              ^^^^^^^^
});`

实际上没有定义密码变量。当您在.then()函数中时,您可以访问从数据库返回的对象。无论是单个结果还是结果集。

user.verifyPassword(user.password, function(err, isMatch) { ... });
                    ^^^^^^^^^^^^^

您必须访问从.findAll()查询中返回的对象内的数据。

希望这有帮助。