#前提
- express v4.16.2
- sequelize v4.22.13
- passport v0.4.0
- bcrypt v1.0.3
以上のミドルウェアを用いて、node.jsで開発を行っています。
CentOS 7上にnvmを用いてnode.jsをインストールし、npmも導入済みです。
#発生した問題
sequelizeのinstanceMethodsを公式に沿って定義したのですが、passport.useの中から読ませようとしてもundefinedになります。
やりたいこととしては、
instanceMethodsにbcryptでcompareした結果を返すメソッドを定義する
↓
passportでログインする際に、パスワードをデータベースから引っ張ってくる
↓
入力されたパスワードとデータベースのパスワードをbcryptでcompareする
という形です。
コードを以下に記載します。
ルーティング:
js
1router.post('/user/login', (req, res, next) => { 2 passport.authenticate('local-login', function(err, user){ 3 if (err) { return next(err); } 4 if (!user) { return res.send('/login'); } 5 req.logIn(user, function(err) { 6 if (err) { return next(err); } 7 return res.redirect('/users/' + user.username); 8 }); 9 })(req, res, next); 10});
これをaxiosを使ってajaxで叩いています。
passportのストラテジー設定
js
1const passport = require('passport'); 2const LocalStrategy = require('passport-local').Strategy; 3 4const db = require('./../db/models'); 5 6 7 passport.serializeUser(function(user, done) { 8 done(null, user.id); 9 }); 10 11 passport.deserializeUser(function(user, done) { 12 console.log(user.id); 13 db.User.findById(user.id).then(user => { 14 done(null, user); 15 }); 16 }); 17 18 19 passport.use('local-login', new LocalStrategy({ 20 usernameField: 'email', 21 passwordField: 'pass', 22 passReqToCallback: true 23 }, function(req, email, pass, done){ 24 25 // process.nextTick(() => { 26 27 db.User.findOne({where: {'email': email}}).then(user => { 28 console.dir(user); 29 console.log(user.auth(pass)); 30 if(!user){ 31 return done(null, false); 32 }else if(!user.auth(pass)){ 33 return done(null, false); 34 }else{ 35 return done(null, user); 36 } 37 }); 38 39 //}); 40 41 })); 42 43module.exports = passport;
データベースのモデル定義:
js
1'use strict'; 2import bcrypt from 'bcrypt'; 3 4module.exports = (sequelize, DataTypes) => { 5 var User = sequelize.define('User', { 6 name: DataTypes.STRING, 7 email: DataTypes.STRING, 8 password: DataTypes.STRING, 9 user_type: DataTypes.INTEGER, 10 authority: DataTypes.INTEGER, 11 api_key: DataTypes.STRING 12 }, { 13 hooks: { 14 beforeCreate: hashPasswordHook, 15 beforeUpdate: hashPasswordHook, 16 }, 17 classMethods: { 18 associate: function(models) { 19 // associations can be defined here 20 }, 21 } 22 }); 23 24 User.prototype.auth = function(password){ 25 bcrypt.compare(password, this.password, function(err, res){ 26 //console.log(res); 27 return res; 28 }); 29 }; 30 31 return User; 32}; 33 34function hashPasswordHook(user, options){ 35 if(user.password != undefined && user.password != "" && user.password != user.previous("password")){ 36 return bcrypt.hash(user.password, 10) 37 .then((hash) => { 38 user.password = hash; 39 }); 40 } 41};
以上よろしくお願いいたします。
あなたの回答
tips
プレビュー