使用bcrypt比较功能时出错

时间:2018-03-19 18:31:57

标签: node.js npm sails.js bcrypt

尝试将密码与bcrypt进行比较时出现此错误 错误: Error: data and hash arguments required

这是我的代码

//compare password
        bcrypt.compare(req.param('password'), user.encryptedPassword, function(err, valid) {
            if (err) return next(err);

            //if password doesn't match
            if (!valid) {
                var usernamePasswordMismatchError = [{name: 'usernamePasswordMismatch', message: 'Invalid Password'}]
                req.session.flash = {
                    err: usernamePasswordMismatchError
                }
                res.redirect('/session/new');
                return;
            }

            //log user in
            req.session.authenticated = true;
            req.session.User = user;

            //redirect user to profile page
            res.redirect('/user/show/'+ user.id);
        });  

这是我的架构设置

  module.exports = {
   attributes: {

     name: {
       type: 'string',
       required: true
     },
     email: {
       type: 'string',
       email: true,
       required: true,
       unique: true
     },
     phone: {
       type: 'string',
       required: true
     },
     encryptedPassword: {
       type: 'string'
     },

     toJSON: function() {
       var obj = this.toObject();
       delete obj.password;
       delete obj.encryptedPassword;
       delete obj._csrf;
       return obj;
    }

   },
  connection:'mongodb'
 };

请问出错了什么?

2 个答案:

答案 0 :(得分:0)

当您调用bcrypt.compare()函数时,您需要确保同时提供密码和散列密码。所以在那里打印,看看你错过了什么。

案例1:由于某种原因,req.param('密码')为空(html表单中的字段名称可能有拼写错误)

案例2:user.encryptedPassword为空。对于这种情况,原因可能是您在创建/更新用户记录时没有加密密码。为了确保您这样做,请打开您的数据库,并在创建新用户后检查数据库中的记录,看看您的encryptedPassword是否存在。以下是如何在创建/更新时加密密码的示例:

在您的用户模型中,您可能具有以下功能:

beforeUpdate: function (values, next) {
    if (values.password) {
        bcrypt.hash(values.password, 10, function (err, hash) {
            if (err) {
                return next(err);
            }
            values.encryptedPassword = hash;
            next();
        });
    }
},

beforeCreate: function (values, next) {
    bcrypt.hash(values.password, 10, function (err, hash) {
        if (err) {
            return next(err);
        }
        values.encryptedPassword = hash;
        next();
    });
}

请注意以下这一行:

values.encryptedPassword = hash;

由于您在架构中没有密码属性,因此提供的values.password不会保存在任何位置。在您的情况下,另一件事可能是您没有在任何地方设置encryptedPassword。因此,另一种方法是更改​​架构并将encryptedPassword重命名为简单密码,然后替换

values.encryptedPassword = hash;

values.password = hash;

答案 1 :(得分:-1)

不确定比较函数的范围,但它看起来像bcrypt.compare的输入参数中的一个或两个都是空的或null。 (比较函数需要两个输入参数非空和非空)

尝试记录您的req.param('password')和user.encryptedPassword以进一步调试您的问题。

参考:https://github.com/kelektiv/node.bcrypt.js