使用bycryptJS和sequelize

时间:2017-02-01 06:03:40

标签: node.js bcrypt

我正在尝试哈希用户输入密码,但不确定我是否应该在处理对数据库的post请求或实际模型本身的路径中直接执行此操作。我正在使用文档中的bcrypt代码,似乎我需要将函数传递给以下代码:

bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash("B4c0/\/", salt, function(err, hash) {
        // Store hash in your password DB. 
    });
});

我目前在路由器文件中设置了这个。

router.post('/friend-book/register', function(req, res){

            db.users.create(req.body).then(function(data){
                console.log("register data", data);

                console.log("poop", data.id);
                req.session.user = {
                    id: data.id,
                    name: data.name,
                    username: data.username,
                    email: data.email,
                    description: data.description
                };

                bcrypt.genSalt(10, function(err, salt) {
                    bcrypt.hash(req.body.password, salt, function(err, hash) {
                        // Store hash in your password DB. 
                    });
                });

                res.render("profile", req.session.user);

            });
});

我的模特

module.exports = function(sequelize, DataTypes){
    var users = sequelize.define('users', {
        name: DataTypes.STRING,
        username: DataTypes.STRING,
        password: DataTypes.STRING,
        email: DataTypes.STRING,
        description: DataTypes.STRING
    });
    return users;
}

1 个答案:

答案 0 :(得分:2)

所以我把散列函数放在了beforeCreate钩子里面。

module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define('User', {
    email: { type:DataTypes.STRING, validate: { isEmail: true}, required: true, unique: true},
    password: { type:DataTypes.STRING, required: true}
  }, {
    underscored: true,
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    },
    instanceMethods: {
    },
    hooks: {
      beforeCreate: function(user, options) {
          return new Promise((resolve, reject) => {
            bcrypt.hash(user.password, 8, (err, data) => {
              if (err) reject(err);
              user.password = data;
              resolve();
            })
          });
        }
      }
  });
  return User;
};

有一件事,我使用(并且总是会使用)bcrypt模块而不是bcrypt-js,因为它是bcrypt的C ++实现并且更快。