前提・実現したいこと
Node.js で、emailアドレスとパスワードを用いてユーザー登録とログイン機能を実装しようとしています。
登録時に入力したパスワードを暗号化するわけですが、
ログイン時に入力したパスワードと、DB内の暗号化されたパスワードをどう比較すればよいのかわかりません。
方法としては、
1 入力したパスワードを登録時と同様に暗号化する
2 DB内のパスワードを複合化する
があるかと思うのですが、いずれもコードの書き方がいまいち、よくわからないです。
DB: sqlite
パスワード: 英数8~32文字
パスワードの暗号方法: hash :server/src/models/User.js 参照
ログイン時に、 User.js のhooks内と同様の処理を行ってパスワードを暗号化すればよいかと思うのですが、その書き方がわからないです。
User.js
javascript
1const Promise = require('bluebird') 2// bcrypt-nodejs内のすべてのメソッドにPromise版を追加する 3const bcrypt = Promise.promisifyAll(require('bcrypt-nodejs')) 4 5function hashPassword(user, options) { 6 const SALT_FACTOR = 8 7 8 if (!user.changed('password')) { 9 return; 10 } 11 12 return bcrypt.genSaltAsync(SALT_FACTOR) 13 .then(salt => bcrypt.hashAsync(user.password, salt, null)) 14 .then(hash => { 15 user.setDataValue('password', hash) 16 }) 17} 18 19module.exports = (sequelize, DataTypes) => { 20 const User = sequelize.define('User', { 21 email: { 22 type: DataTypes.STRING, 23 unique: true 24 }, 25 password: DataTypes.STRING 26 }, { 27 // ユーザーをDBに登録する前に、bcryptを用いてpasswordをハッシュする。 28 hooks: { 29 beforeCreate: hashPassword, 30 beforeUpdate: hashPassword, 31 beforeSave: hashPassword, 32 } 33 }) 34 35 User.prototype.comparePassword = function (password) { 36 return bcrypt.compareAsync(password, this.password) 37 } 38 39 return User 40}
試したこと
登録時にパスワードのhashを行わなかった(hooksの記述を削除した)場合、ログインもうまくいきました。
補足情報(FW/ツールのバージョンなど)
全体のソースはgithubに置いています。
https://github.com/AyumuShigeta/VueExpress-Window
master_express.js_server_dir_sqlite_vuetifyブランチで、
$ cd server
$ node src/app.js
でローカルサーバーが起動します。
また、フロント側は
$ cd appSrc
$ npm run dev
で見られるようになります (cssなどのスタイルは整っていません)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。