passportによるログインの実装


概要


  • passportはノードの認証ミドルウェアです.

  • Webアプリケーションは、次の方法でログインできます.
  • IDとパスワードでログイン(ローカルログイン)
  • FacebookやGoogleなどのサイトのアカウントを使用して
  • にログインします.

  • passportは、ポリシー(Strategy)と呼ばれる認証メカニズムを用いて、それぞれのログイン方法を実現する.
  • 資格認定

  • の公式文書によると、passportは以下の通りです.authenticate()を使用して認証を要求できます.
  • app.post('/login', passport.authenticate('local', { successRedirect: '/',
                                                        failureRedirect: '/login' }));
    またはコールバック関数の内部passportです.authenticate()を呼び出すことができます.
    app.post('/login', (req, res, next) => {
      passport.authenticate('local', (err, user, info) => {
        // code
        return req.login(user, callback);
      }) (req, res, next);
    });

  • passport.authenticate()の2番目のパラメータのコールバック関数をカスタムコールバックと呼びます.

  • custom callbackを使用しないと自動的にreqされます.loginは呼び出されますが、custom callbackを使用すると直接reqします.login()を呼び出す必要があります.Customcallbackのパラメータは、「local」から呼び出されたdone関数から来ます.

  • passport.authenticate()はミドルウェアオブジェクトを返すので、リクエスト応答サイクルを維持するために(req,res,next)を末尾に貼り付ける必要があります.
  • Strategy

  • passportというフォルダを作成し、それぞれのログインポリシーを実装するモジュールを事前に作成してエクスポートします.モジュールインデックスがエクスポートされます.jsにロードして実行します.
  • // index.js
    const passport = require('passport');
    const local = require('./localStrategy');
    const kakao = require('./kakaoStrategy');
    
    module.exports = () => {
      local();
      kakao();
    }
  • index.jsがエクスポートしたモジュールはappです.またjs上で実行します.
  • // app.js
    const passportIndex = require('./passport');
    passportIndex();

    localStrategy

    // localStrategy.js
    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    
    passport.use(new LocalStrategy((username, password, done) => {
      // code
    }));

  • New LocalStrategy()の最初のパラメータコールバック関数をverify callbackと呼びます.verify callbackは、ログイン要求の認証情報を確認するために、ログイン認証情報をパラメータとして受け入れます.

  • verify callbackはdone関数を呼び出すことができ、done()のパラメータはerrorの順で、成功した場合はflash message(失敗した場合はmessage)です.Flash messageはオプションです.
  • return done(null, user)	// 자격이 유효한 경우
    return done(null, false, { message: 'incorrect password' })  // 실패한 경우
  • done()を実行してからpassportを再実行します.authenticate()を返し、要求します.login(user,callback)を実行します.このときユーザオブジェクト(user)が受信された場合、req.ユーザーをユーザーに割り当てます.
  • serializeUser

  • ログインに成功すると、セッションはCookieによって確立され、メンテナンスされ、シーケンス化されたユーザによってユーザオブジェクトをセッションに保存できます.この場合、ストレージオブジェクト全体よりも軽いidを保存し、逆シーケンス化ユーザによりuserオブジェクトを復元するだけです.
  •     passport.serializeUser((user, done) => {
            return done(null, user.id);
        });
  • done()の実行結果により、sessionオブジェクト内部にpassportプロパティが生成されます.このプロパティにはuserが含まれています.idを含む.
  • deserializeUser

    passport.deserializeUser((id, done) => {
      User.findOne({ where: { id } })
        .then(user => done(null, user))
        .catch(err => done(err));
    });

  • ブラウザがセッションクッキー(リクエスト)appを送信する場合.jsのパスポート.session()ミドルウェアはidを識別し、idを伝達するために逆シーケンス化ユーザを実行する.逆シーケンス化ユーザーは、このidを使用してデータベースをクエリーします.

  • 復元されたユーザ情報はreqである.ユーザーとしてアクセスできます.さらにisAuthenticated propertyがtrueに変更されました.
  • app.js

  • app.jsでは、次のミドルウェアを使用します.
  • app.use(passport.initialize());	// passport 초기화
    app.use(passport.session());	// 영구 로그인세션 사용시
  • passport.セッション()はセッションを受信する必要があるため、expressssessionの下にある必要があります.