外部 ID によるセッションの管理

この記事では、認証に外部 ID を使用する場合に Identity-Aware Proxy(IAP)でセッションを管理する方法について説明します。

セッションの更新

Identity Platform セッションの有効期間は 1 時間です。セッションが期限切れになったら、アプリを認証ページにリダイレクトする必要があります。認証ページには Identity Platform の更新トークンが含まれています。ユーザーの認証情報が有効であれば、UI を表示することなく、その認証情報で再度認証を行うことができます。

ユーザーが最近メールアドレスまたはパスワードを変更したか、別の操作でトークンが取り消された場合は、再度認証フローを完了する必要があります。

AJAX 以外のリクエストの処理

AJAX 以外のリクエストはアプリケーションのリダイレクトを使用して自動的に処理されます。これは、認証ページが正しく構成されていることを前提としています。

AJAX リクエストの処理

Chrome などのブラウザは、サードパーティ Cookie を段階的に廃止しています。サードパーティ Cookie が無効になっている場合、このページにある AJAX リクエストを行う際の推奨事項は使用できません。ただし、AJAX リクエストのソースとターゲットの両方が同じサイトからのものである場合、推奨事項は提示されます。

Chrome でサードパーティの Cookie を管理する手順については、Chrome で Cookie を削除、許可、管理するをご覧ください。

期限切れのトークンを含む AJAX リクエストを送信すると、リクエストで 401: Unauthorized ステータス コードが返されます。この問題を解決するには、次のいずれかの解決策を行います。

  • HTTP 401 ステータス コードを処理するように、アプリケーションのコードを変更する。
  • セッション更新ルーチンを参照するように、アプリケーションに iframe を追加する。
  • セッション更新ルーチンを別のタブに手動で読み込むようにユーザーに指示する。

AJAX リクエストに対して 401 ではなく 302 ステータス コードを受け取った場合は、XMLHttpRequest の値を設定して X-Requested-With ヘッダーを追加します。これにより、リクエストが JavaScript から生成されていることが IAP に通知されます。

プログラムによる HTTP 401 の処理

AJAX セッションを更新する場合は、HTTP 401 ステータス コードをプログラムで処理することをおすすめします。方法:

  1. エラーを処理するように、アプリケーション コードを更新します。

    if (response.status === 401) {
      statusElm.innerHTML = 'Login stale. <input type="button" value="Refresh" onclick="sessionRefreshClicked();"/>';
    }

  2. ユーザーの再認証を行うウィンドウを開き、処理の完了後にウィンドウを閉じるハンドラを追加します。

    var iapSessionRefreshWindow = null;
    
    function sessionRefreshClicked() {
      if (iapSessionRefreshWindow == null) {
        iapSessionRefreshWindow = window.open("/?gcp-iap-mode=DO_SESSION_REFRESH");
        window.setTimeout(checkSessionRefresh, 500);
      }
      return false;
    }
    
    function checkSessionRefresh() {
      if (iapSessionRefreshWindow != null && !iapSessionRefreshWindow.closed) {
        fetch('/favicon.ico').then(function(response) {
          if (response.status === 401) {
            window.setTimeout(checkSessionRefresh, 500);
          } else {
            iapSessionRefreshWindow.close();
            iapSessionRefreshWindow = null;
          }
        });
      } else {
        iapSessionRefreshWindow = null;
      }
    }

iframe の使用

HTTP 401 をプログラムで処理できない場合は、セッション更新ルーチンを参照するアプリケーションに iframe を追加します。

iframe を使用する場合は、IAP で保護されたウェブアプリと同じドメインにカスタム ログインページを構成する必要があります。構成しない場合、ユーザーはクロスオリジン エラーが発生します。ログインページの構成の詳細については、カスタム ログインページを作成するをご覧ください。

iframe の使用例:

<iframe src="https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER" style="width:0;height:0;border:0; border:none;"></iframe>

セッション更新ルーチンを読み込む

最後の手段として、セッション更新ルーチンを手動で読み込むようにユーザーに指示します。別のタブで次の URL を開くようユーザーに指示するガイダンスをアプリケーションまたはドキュメントに追加します。

https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER

ユーザーのログアウト

ユーザーを IAP リソースからログアウトするには、クエリ パラメータ ?gcp-iap-mode=GCIP_SIGNOUT を使用します。たとえば、App Engine アプリの場合、URL は次のようになります。

https://example.com/some/path?gcp-iap-mode=GCIP_SIGNOUT

ログアウトしたユーザーは、ログインページにリダイレクトされます。

すべてのリソースとセッションからユーザーをログアウトするには、API キーと mode=signout をパラメータとして追加し、ユーザーを認証 URL にリダイレクトします。例:

https://auth.example.com/?apiKey=API-KEY&mode=signout

ログアウトが完了した後もユーザーはページに残ります。ログアウトに成功したことをユーザーに通知できるように、AuthenticationHandler オブジェクトに completeSignOut() コールバックを実装することを検討してください。

テナントの切り替え

ユーザーが同じ IAP リソースで複数のテナントの認証を行うことがあります。たとえば、レベルの異なるアクセス権を付与する複数のテナントに属しているユーザーが、権限の少ないテナントに切り替える場合があります。

テナント選択プロセスを強制的に再起動するには、?gcp-iap-mode=CLEAR_LOGIN_COOKIE を使用します。たとえば、App Engine アプリの場合、URL は次のようになります。

https://PROJECT-ID.appspot.com/some/path?gcp-iap-mode=CLEAR_LOGIN_COOKIE

次のステップ