1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Webの勉強はじめてみた その30 〜GitHub認証とテスティングフレームワーク〜

Posted at

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);
  });
});

まとめ

テストの大切さ、とは言いつつ実際経験しないと手順とか、勉強だけではわからない部分が増えてきた印象。そろそろこれまでの部分をまとめたい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?