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

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

セッションの更新

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

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

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

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

AJAX リクエストの処理

期限切れのトークンを含む 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 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

次のステップ