N予備校「プログラミング入門Webアプリ」を受講しています。
今回は第4章4〜6節です。
GitHub認証
GitHub上のログインの認証機能を、自分が開発するアプリケーションに利用する。
OAuth の利用
その前に認可と認証について
アプリケーションの利用者が第三者のアプリケーションに権限を与えることで、 そのアプリケーションの機能や認証を第三者のアプリケーションでも利用できるようにする仕組み
OAuth2.0
は認証済みユーザーに対して権限を与える、認可のためのプロトコル。
user => github => website => user
認証 認可 ログイン
なんとなくこんな感じだろうか。
ストラテジーモジュール
必要なものだけをインストールできるように部品に分けたモジュール。
今回はGitHubなので、passport
の他に、passport-github
, express
内でログイン情報をセッション管理するための、express-session
ライブラリを一緒にインストール。
// OAuth
const session = require('express-session');
const passport = require('passport');
const GitHubStrategy = require('passport-github2').Strategy;
// GitHub Token
const GITHUB_CLIENT_ID ='xxxxxxxx';
const GITHUB_CLIENT_SECRET = 'xxxxxxxxxxxx';
// Passport の設定
passport.serializeUser(function(user, done){
done(null, user);
});
passport.deserializeUser(function(obj, done){
done(null, obj);
})
// Passport の登録
passport.use(new GitHubStrategy({
clientID: GITHUB_CLIENT_ID,
clientSecret: GITHUB_CLIENT_SECRET,
callbackURL: 'http://localhost:8000/auth/github/callback'
},
function(accessToken, refreshToken, profile, done){
// 非同期で実行する
process.nextTick(function(){
return done(null, profile);
});
}
))
// Sessionを利用する
app.use(session(
{
// Secret Key
secret: 'xxxxxxxx',
// セッションを保存しない
resave: false,
// 初期化時にセッションを保存しない
saveUninitialized: false
}
));
app.use(passport.initialize());
app.use(passport.session());
// /auth/github にアクセスがあった場合
app.get('/auth/github',
// GitHub ログイン画面へジャンプ
passport.authenticate('github', {
// GitHub上のユーザー名とアドレスを使って認可する
scope: ['user:email']
}),
function(req, res){
// ログを出力したいときはここに処理をかく
}
);
// Callback
app.get('/auth/github/callback',
passport.authenticate('github', {
// 認可失敗の場合 ログイン
failureRedirect: '/login'
}),
function (req, res){
// 認可成功の場合 トップページへ
res.redirect('/');
}
)
// ログイン
app.get('/login', function(req, res){
res.render('login');
})
// ログアウト
app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
})
テスティングフレームワーク
テストについて
ユニットテスト: モジュール単体をテストする
結合テスト: 複数のモジュールを結合して機能をテストする
システムテスト: システム全体が正しく動くことをテストする
Jest を使う
Node.js
上でテストの実行結果を集計して、わかりやすく表示してくれる。
yarn add jest@25.1.0 --dev
--dev
: 開発時のみ利用するライブラリをpackage.json
に記述しつつインストールする。
npx
ローカルにインストールされたモジュールを直接実行できる。
node node_modules/.bin/jest -h
が、
npx jest -h
になる。
// 一つ上の階層のindex.jsをimport
const dc = require('../');
// テストのカテゴリ分け
describe('#effectiveDamage()', () => {
// 1つのテストにテキストで意味をつける
test('正常なダメージ計算ができる', () => {
// 実際にテストする内容
expect(dc.effectiveDamage(100, 50, 30)).toBe(83);
});
test('負の異常値におけるダメージ計算ができる', () => {
expect(dc.effectiveDamage(-1, 0, 0)).toBe(0);
expect(dc.effectiveDamage(0, -1, 0)).toBe(0);
expect(dc.effectiveDamage(0, 0, -1)).toBe(0);
});
});
まとめ
テストの大切さ、とは言いつつ実際経験しないと手順とか、勉強だけではわからない部分が増えてきた印象。そろそろこれまでの部分をまとめたい。