前回の記事ではユーザーtestパスワードtestのみのログインユーザーであった為、MySQLにユーザー情報を入れ、そこを参照してログインするを実装した備忘録です。
各バージョン
- Node v12.13.1
- express-session 1.17.1
- passport 0.4.1
- passport-local 1.0.0
- mysql 2.18.1
- bookshelf 1.2.0
- knex 0.21.1
では実装手順です。
必要なモジュールをインストールします。
terminal
npm install i mysql knex bookshelf
前回記事のユーザー名・パスワードをチェックするプログラムです。
index.js
passport.use(new localStrategy({
usernameField:'username',
passwordField:'password',
passReqToCallback: true,
session:false,
},function(req,username,password,done){
process.nextTick(function(){
if(username === 'test' && password === 'test'){
return done(null,username);
}else{
console.log('Login Error');
return done(null,false,{message:'パスワードが正しくありません'});
}
})
}));
if(username===....のところをMySQLからデータを参照するプログラムに変更します。
実際に運用する場合は、パスワードはハッシュ化すべきでしょうが、今回はやっていません。
index.js
var mysql = require('mysql');
var knex = require('knex')({
client:'mysql',
connection:{
host:'localhost',
user:'root',
password:'',
database:'データベース名',
charset:'utf8',
}
});
var Bookshelf = require('bookshelf')(knex);
var User = Bookshelf.Model.extend({
//1
tableName:'users'
});
passport.use(new localStrategy({
usernameField:'username',
passwordField:'password',
passReqToCallback: true,
session:false,
},function(req,username,password,done){
process.nextTick(function(){
//2
var reqName = req.body.username;
var reqPass = req.body.password;
User.query({where: {username:reqName}, andWhere:{password:reqPass}})
.fetch().then((model) => {
if(model){
return done(null,username);
}else{
console.log('Login Error');
return done(null,false,{message:'パスワードが正しくありません'});
}
});
});
}));
//1はユーザーデータがあるテーブル名を指定。
//2は/loginから送られてきたユーザー名とパスワードとデータベースを参照しています。
今回はここまでですが、本来はバリデーションを行ったり、ユーザー名はあってるけどパスワードが違う判定を行ったりするべきだと思いますが、その実装が出来たらまた、記事を書きます。
間違い、指摘がありましたらお願いします。
以上です。
参考文献