SequelizeにてinstanceMethodsが機能しない
- 評価
- クリップ 1
- VIEW 123
前提
- 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する
という形です。
コードを以下に記載します。
ルーティング:
router.post('/user/login', (req, res, next) => {
passport.authenticate('local-login', function(err, user){
if (err) { return next(err); }
if (!user) { return res.send('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
これをaxiosを使ってajaxで叩いています。
passportのストラテジー設定
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const db = require('./../db/models');
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(user, done) {
console.log(user.id);
db.User.findById(user.id).then(user => {
done(null, user);
});
});
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'pass',
passReqToCallback: true
}, function(req, email, pass, done){
// process.nextTick(() => {
db.User.findOne({where: {'email': email}}).then(user => {
console.dir(user);
console.log(user.auth(pass));
if(!user){
return done(null, false);
}else if(!user.auth(pass)){
return done(null, false);
}else{
return done(null, user);
}
});
//});
}));
module.exports = passport;
データベースのモデル定義:
'use strict';
import bcrypt from 'bcrypt';
module.exports = (sequelize, DataTypes) => {
var User = sequelize.define('User', {
name: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING,
user_type: DataTypes.INTEGER,
authority: DataTypes.INTEGER,
api_key: DataTypes.STRING
}, {
hooks: {
beforeCreate: hashPasswordHook,
beforeUpdate: hashPasswordHook,
},
classMethods: {
associate: function(models) {
// associations can be defined here
},
}
});
User.prototype.auth = function(password){
bcrypt.compare(password, this.password, function(err, res){
//console.log(res);
return res;
});
};
return User;
};
function hashPasswordHook(user, options){
if(user.password != undefined && user.password != "" && user.password != user.previous("password")){
return bcrypt.hash(user.password, 10)
.then((hash) => {
user.password = hash;
});
}
};
以上よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 91.04%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる