【问题标题】:Error using bcrypt compare function使用 bcrypt 比较函数时出错
【发布时间】:2018-03-19 18:31:57
【问题描述】:

尝试将密码与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'
 };

请问你做错了什么?

【问题讨论】:

  • 生成密码哈希的代码是什么样的?
  • 密码哈希在架构中完成
  • “在架构中完成”是什么意思。哪个代码生成它?您需要在某个地方使用bcrypt 生成它,以便稍后比较哈希。
  • 请给我一个例子.....只是学习最近的风帆

标签: node.js npm sails.js bcrypt


【解决方案1】:

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

案例一:req.param('password') 因某种原因为空(你的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;

【讨论】:

    【解决方案2】:

    不确定您的比较函数的范围,但看起来您的 bcrypt.compare 输入参数中的一个或两个为空或 null。 (比较函数要求输入参数均为非空且非空)

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2021-09-30
      • 1970-01-01
      • 2019-10-11
      • 2014-09-07
      相关资源
      最近更新 更多