2017-09-30 14 views
0

Sequelizeで作成したモデルでbeforeCreate操作を実行しようとしています。ユーザーを作成する前にパスワードと塩を保存しようとしています。ただし、ユーザーは暗号化されたパスワードまたは塩なしで作成されます。私はNode.JSに慣れていませんが、これは非同期の性質と関係していると仮定しています。私の作成関数が意図したとおりに動作するように、コールバックを適切に導入する方法Sequelize:Create Hookが意図したとおりに動作しない前に

モデル:

'use strict'; 
 
var Promise = require("bluebird"); 
 
var bcrypt =Promise.promisifyAll(require("bcrypt-nodejs")); 
 
const SALT_ROUNDS = 10; 
 

 
module.exports = function(sequelize, DataTypes) { 
 
    var User = sequelize.define('User', { 
 
    username: { type: DataTypes.STRING, unique: true, allowNull: false, validate: { notEmpty: true } }, 
 
    email: { type: DataTypes.STRING, unique: true, allowNull: false, isEmail: true }, 
 
    phone_number: DataTypes.STRING, 
 
    password_hash: { type: DataTypes.STRING, allowNull: false, unique: true, validate: { notEmpty: true } }, 
 
    password_salt: DataTypes.STRING, 
 
    first_name: DataTypes.STRING, 
 
    last_name: DataTypes.STRING, 
 
    user_type: DataTypes.INTEGER, 
 
    two_factor_enabled: { type: DataTypes.BOOLEAN, defaultValue: false, }, 
 
    email_verified: DataTypes.DATE, 
 
    active: { type: DataTypes.BOOLEAN, defaultValue: true, }, 
 
    }, { 
 
    classMethods: { 
 
     associate: function(models) { 
 
     // associations can be defined here 
 
     }, 
 
     validPassword: function(password, passwd, callback) { 
 
     bcrypt.compare(password, passwd, function(err, isMatch) { 
 
      if (isMatch) { 
 
      return callback(null, true); 
 
      } else { 
 
      return callback(null, false); 
 
      } 
 
     }); 
 
     }, 
 
    }, 
 
    hooks: { 
 
\t beforeCreate: function(user, {}) { 
 
\t \t bcrypt.genSalt(SALT_ROUNDS, function(err, salt) { 
 
\t \t \t bcrypt.hash(user.password_hash, salt, function(){}, function(err, hash) { 
 
\t \t \t \t if (err) { 
 
\t \t \t \t \t return sequelize.Promise.reject(err); 
 
\t \t \t \t } 
 

 
\t   \t \t user.setDataValue('password_hash',hash); 
 
\t \t \t \t user.setDataValue('password_salt',salt); 
 
\t \t \t }); 
 

 
\t \t }); 
 
\t } 
 
    }, 
 
    instanceMethods: { 
 
\t generateHash: function(password) { 
 
\t \t return bcrypt.hashSync(password, bcrypt.genSaltSync(10), null); 
 
\t }, 
 
\t validPassword: function(password) { 
 
\t \t return bcrypt.compareSync(password, this.password); 
 
\t } 
 
    } 
 
    }); 
 

 
    //User.associate = (models) => { 
 
    // User.hasMany(models.UserType, { 
 
    // foreignKey: 'userId', 
 
    // as: 'userTypes' 
 
    // }); 
 
    //}; 
 

 
    return User; 
 
};

そして、ここで呼び出します:

return db.User 
 
\t \t \t .create({ 
 
\t \t \t \t first_name: req.body.first_name, 
 
\t \t \t \t last_name: req.body.last_name, 
 
\t \t \t \t username: req.body.username, 
 
\t \t \t \t email: req.body.email, 
 
\t \t \t \t password_hash: req.body.password \t 
 
\t \t \t }) 
 
\t \t \t .then(user => res.status(201).send(user)) 
 
\t \t \t .catch(error => res.status(400).send(error)); 
 
\t \t },

答えて

0

Personnaly私は暗号化を使用し、node.jに含まれては、

);私は、これはあなたを助けることを願っています

beforeCreate: (user, options, cb) => { 
    const saltAndHash = createHash(user.password); 
    user.salt = saltAndHash.salt; 
    user.password = saltAndHash.hash; 
    return cb(null, options); 
} 

:S:

function createHash(password, salt) { 
    const generatedSalt = typeof salt !== 'undefined' ? salt : crypto.randomBytes(128).toString('base64'); 
    const hmac = crypto.createHmac('sha256', generatedSalt); 
    hmac.update(password); 
    const hashedPassword = hmac.digest('hex'); 
    return { 
    salt: generatedSalt, 
    hash: hashedPassword 
    }; 
} 

そして、私のユーザモデルで:https://nodejs.org/api/crypto.html

私はハッシュを作成する機能を持っています

関連する問題