Passportを使ってログイン後に要求されたページを表示する方法

Node.jsExpressの環境でPassportを使って認証処理を行った後、固定のページではなく、要求されたページにリダイレクトさせる方法です。
例えば、「ログイン画面」から「トップ画面」に遷移してその先に「設定画面」がある場合。下記のNode.js+Expressの環境で認証機能を実装するでは、ログイン後、必ず「トップ画面」が表示されていました。これを「設定画面」のアドレスでアクセスしてきた時はログイン後に「設定画面」へ遷移させます。

Node.js+Expressの環境で認証機能を実装する
本記事は上記Node.js+Expressの環境で認証機能を実装するのソースコードを理解している前提での話となります。

特定のページのみであれば、各ルーティングで認証を記述すればいいです。多くのページで共通の認証確認を利用したい場合は次のようにします。

変更前

app.post('/login', passport.authenticate('local', { failureRedirect: 'login.html',
                                                    session: false,
  }),
  (request, response) => {
    console.log('login ok');
    response.sendFile(path.join(__dirname, 'public/top-page.html'));
  });

app.get('/settings', isAuthenticated, (request, response) => {
  // 認証済みの場合の処理.
  response.sendFile(path.join(__dirname, 'public/settings.html'));
});

function isAuthenticated(request, response, next) {
  if (request.isAuthenticated()) {
    // 認証済みの場合の処理へ.
    return next();
  }

  // 認証していない場合の処理.
  response.redirect('/');
}

変更後

セッションに要求されたページのパスを保存します。ログイン成功後、セッションにパスが保存されていればそのページへ、セッションにパスが保存されていなければデフォルトのページへ遷移させます。

app.post('/login', passport.authenticate('local', { failureRedirect: 'login.html',
                                                    session: false,
  }),
  (request, response) => {
    console.log('login ok');

    if (request.session.redirectTo) {
      const redirectTo = request.session.redirectTo;
      delete request.session.redirectTo;
      response.redirect(redirectTo);
      return;
    }

    response.sendFile(path.join(__dirname, 'public/top-page.html'));
  });

app.get('/settings', isAuthenticated, (request, response) => {
  // 認証済みの場合の処理.
  response.sendFile(path.join(__dirname, 'public/settings.html'));
});


function isAuthenticated(request, response, next) {
  if (request.isAuthenticated()) {
    // 認証済みの場合の処理へ.
    return next();
  }

  // 認証していない場合の処理.
  request.session.redirectTo = request.path;
  response.redirect('/');
}

クエリパラメータも保持したい場合はrequest.originalUrlrequest.queryをセッションに保存しておきます。(GETの場合)

このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です