Node.JSとPassportを使って認証処理を実装する方法
よくある認証処理をつくります。
https://loginsample.glitch.me/
こういうページがでてきて認証を求められる仕組みです。
Passportモジュールを使うと割と簡単に作ることができます。
最初に環境を準備します
npm init -y npm install express --save npm install express-session --save npm install passport --save npm install passport-local --save npm install body-parser --save
たくさんのモジュールを入れる必要があります。
このまま実行すれば大丈夫です。
app.js
var express = require('express'); var app = express(); var passport = require('passport'); app.use(passport.initialize()); var session = require('express-session'); app.use(session({secret: '123456'})) app.use(passport.session()); passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { User.findById(id, function(err, user) { done(err, user); }); }); var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({extended:true})); var LocalStrategy = require('passport-local').Strategy; // 認証処理の定義 passport.use(new LocalStrategy(function(username, password, done){ if (username == 'admin' && password == 'password') { return done(null, username); } else { return done(null, false); } })) // EJS設定 app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); // ログインページ app.get('/', function (req, res) { res.render('login', {}); }); // 認証処理 app.post('/auth', passport.authenticate('local', { successRedirect: '/secret', failureRedirect: '/', failureFlash: true })); // 認証後ページ app.get('/secret', function (req, res) { if ('passport' in req.session && 'user' in req.session.passport) { res.render('secret', {}); } else { res.redirect('/'); } }); app.listen(3000, function () { });
簡単とはいっても、やはり難しいです。
重要なのは「認証処理の定義」と「認証処理」の部分です。
認証後ページではセッションの内容をチェックして、ログインされていなければログイン画面に飛ばしています。
動かしてみれば、なんとなく理解できるはずです。
ユーザ登録の仕組みはありません
プログラム上にも書いてあるとおり
ユーザ名は「admin」
パスワードは「password」
でログインできます。
login.ejs
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <title>ログイン</title> </head> <body> <div class="container" style="padding: 1.25rem;"> <div class="card"> <h5 class="card-header">ログイン</h5> <div class="card-body"> <form action="/auth" method="post" autocomplete="off"> <div class="form-group"> <label for="text1">ユーザID</label> <input type="text" id="username" name="username" class="form-control" autofocus> </div> <div class="form-group"> <label for="password">パスワード</label> <input type="password" id="password" name="password" class="form-control"> </div> <div class="form-group"> <input type="submit" value="ログイン" class="form-control" /> </div> </form> </div> <div class="card-footer">ユーザ名とパスワードを入力してください。</div> </div> </div> </div> </body> </html>
ログイン画面はこんな感じになりました。
デザインはお好みで調整してください。
inputタグの名前はあわせてください。
secret.ejs
<html> <body> <p>おめでとうございます。ログインできました。</p> </body> </html>
いわゆるログイン後の個人ページです。
まとめ
これでログインページを作れるようになりました。
新規ユーザ登録の画面も作れば、いろいろ応用できますね。