セッション

セッションとは

セッション管理は、ウェブアプリケーションのユーザー認証、状態管理など重要な機能です。セッションデータをサーバー側で管理し、セッションIDをクライアントに送信して、セッションを識別します。

express-session

express-session は、Expressでセッションを利用するためミドルウェアです。セッションの初期化、有効期間、セキュリティ設定などをカスタマイズできます。

インストール

express-sessionパッケージをインストールします。

ターミナル
npm i express-session

express-sessionの設定

メインプログラム「server.js」でexpress-sessionモジュールを読み込み、ミドルウェアに登録します。

server.js
...

//モジュールを読み込み
const session = require('express-session')
//ミドルウェア登録
app.use(session({
    secret: 'secret_key',
    resave: false,
    saveUninitalized: false,
}))

app.use(routes);
  • express-sessionの設定は、ルーティングの前で実行してください

ユーザセッション処理

ユーザページにアクセスするには、セッショチェックが必要です。express-sessionでは、リクエストオブジェクトのsessionプロパティで管理できます。

exports.action = (req, res) => {
   //リクエストオブジェクトのセッション
   req.session
}

ユーザセッション

ユーザログインが成功したら、ユーザ情報をセッションに登録します。

controllers/LoginController.ejs
exports.auth = (req, res) => {
    const email = req.body.login_name;
    const password = req.body.password;

    const user = new User();
    const authUser = user.auth(email, password);

    if (authUser) {
        // ユーザ情報をセッションに登録
        req.session.authUser = authUser;
        res.redirect('/user');
    } else {
        res.redirect('/login');
    }
}

セッションチェック

セッションを取得しViewに受け渡します。また、ユーザデータがなければログインページにリダイレクトします。

controllers/UserController.ejs
exports.index = (req, res) => {
    //セッションからユーザ取得
    var authUser = req.session.authUser;
    if (!authUser) {
        //ユーザがいなければ、ログインページにリダイレクト
        res.redirect('/login')
    }
    //ユーザデータの受け渡し
    var data = {
        user: authUser,
    }
    res.render('user/index', data)
}

ユーザホームの確認

ユーザホームのページ「user/index.ejs」を作成し、ユーザ情報を表示します。

views/user/index.ejs
<div class="mt-3">
  <div>
    <div class="text-end">
      <span class="me-3">
        Welcome, <%= user.name %>
      </span>

      <a class="btn btn-sm btn-outline-primary" href="/user/logout">ログアウト</a>
    </div>
  </div>

  <h2>ユーザ情報</h2>
  <dl>
    <dt>名前</dt>
    <dd>
      <%= user.name %>
    </dd>
    <dt>出身地</dt>
    <dd>
      <%= user.birthplace %>
    </dd>
    <dt>趣味</dt>
    <dd>
      <% user.hobby.forEach((hobby)=> { %>
        <%= hobby %>
      <% }) %>
    </dd>
  </dl>
</div>
結果

ログアウト処理

UserControllerでログアウト処理 logout() を追加します。セッションデータを削除し、ログインページにリダイレクトします。

controllers/UserController.ejs
exports.logout = (req, res) => {
    //ユーザセッション削除
    delete(req.session.authUser)
    //ログインページにリダイレクト
    res.redirect('/login')
}