管理 IAP 工作階段

本頁面說明 Identity-Aware Proxy (IAP) 如何處理具有過期工作階段的要求,以及如何確保 AJAX 應用程式要求和 WebSocket 要求已成功。

IAP 工作階段流程

使用標準 IAP 登入流程時,使用者會收到參照其 Google 登入工作階段的工作階段 Cookie。IAP 會使用這個 Cookie 確認使用者是否仍處於登入狀態。IAP 要求使用者必須先登入,才能存取 IAP 安全防護的應用程式。

系統會定期重新整理 IAP 工作階段。不過,如果使用者使用 Google 帳戶登入,IAP 工作階段也會連結至使用者的 Google 登入工作階段。在這種情況下,IAP 只會在下列其中一項情況下要求使用者重新登入:

  • 使用者已登出帳戶
  • 帳戶已遭停權
  • 帳戶需要重設密碼

如果使用者登出,IAP 會在幾分鐘內偵測到 Google 帳戶狀態變更。偵測到後,IAP 就會使工作階段失效。

在有效工作階段期間,IAP 會重新檢查所有要求的 Identity and Access Management (IAM) 授權。更新 IAP 安全防護應用程式的 IAM 存取權政策可能需要幾分鐘才會生效。

IAP 工作階段過期

如果是使用 Google 帳戶的登入流程,IAP 工作階段會與基礎 Google 登入工作階段綁定,且只有在該工作階段到期時才會到期,不受授權標頭中傳送的 JWT 中 exp 權杖影響。

針對程式輔助驗證,IAP 會尊重授權標頭中傳送的 JWT 中的 exp 憑證附加資訊。

對於 Identity Platform 登入流程,IAP 工作階段在使用者登出後,最多可維持一小時的有效時間。

Google 帳戶登入提示

透過 IapSettings 設定的 loginHint 值必須與登入使用者的網域相符。如果這些值不相符,且 IAP Cookie 已清除或過期,系統就會顯示登入提示。

WebSocket 要求

IAP 僅支援初始要求的 WebSocket,且不會持續檢查授權。收到 WebSocket 要求時,會以 HTTP Upgrade 要求開始。IAP 會將這項資訊視為標準 HTTP GET 要求。要求授權後,IAP 會將要求傳遞至伺服器,開啟持續連線。此後,IAP 就不會監控要求或重新整理工作階段。

過期的工作階段回應

IAP 會根據要求類型,針對過期工作階段傳回不同回應。

非 AJAX 要求

對於非 AJAX 要求,使用者會重新導向至登入流程,藉此重新整理工作階段。如果使用者仍處於已登入的狀態,則這種重新導向是透明公開的。

AJAX 要求

Chrome 和其他瀏覽器正在逐步淘汰第三方 Cookie。如果停用第三方 Cookie,則無法使用本頁面提供的 AJAX 要求建議。不過,如果 AJAX 要求的來源和目標都來自同一個網站,則提供的最佳化建議仍可正常運作。

如要瞭解如何在 Chrome 中管理第三方 Cookie,請參閱「在 Chrome 中刪除、允許使用與管理 Cookie」。

IAP 會使用 Cookie 管理使用者工作階段。這項服務也會依序重新導向,以便在登入流程中建立工作階段。如果應用程式使用跨來源資源共用 (CORS) 向受 IAP 保護的應用程式提出 AJAX 要求,就無法建立工作階段。

如要成功向受 IAP 保護的應用程式提出 CORS 要求,就必須在外部建立 IAP 工作階段。請注意,如果 AJAX 要求是從 source_domain->target_domain 傳送 CORS 要求,而 target_domain 代管受 IAP 保護的應用程式,則必須在 target_domain 上建立工作階段。無法在 source_domaintarget_domain 之間共用 Cookie。

建立 target_domain 的工作階段後,開發人員必須啟用在要求中傳送的憑證。根據預設,JavaScript 方法不會將 Cookie 附加至要求。如要在要求中啟用憑證,請將 XMLHttpRequest 物件中傳送的要求設為 withCredentials 屬性,並將 Fetch API 中傳送的要求設為 credentials 選項,以便將 includesame-origin 設為 include

下列指南建議網頁開發人員採用一種模式,以便成功建立及重新整理 IAP 工作階段。

瞭解應用程式內商品回應

針對 AJAX 要求,IAP 會傳回 HTTP 401: Unauthorized 狀態碼。請注意,AJAX 要求偵測可能無法完美執行。如果 AJAX 要求接收到 302 狀態碼回應而非 401 狀態碼,則可將值為 "XMLHttpRequest"X-Requested-With 標頭新增至 AJAX 要求。這可告知 IAP 要求來自 JavaScript。

處理 HTTP 401 AJAX 回應

如要在應用程式收到 HTTP 401 後建立 IAP 工作階段,應用程式可以為網址 target_domain + ?gcp-iap-mode=DO_SESSION_REFRESH 開啟新視窗。這是一個特殊的處理程序,只會在 target_domain 建立 IAP 工作階段。如果視窗保持開啟狀態,系統會定期重新整理工作階段,並視需要要求使用者輸入內容。使用者可以選擇關閉視窗,開發人員程式碼中 HTTP 401 狀態的處理常式應視需要再次彈出視窗,以便重新整理工作階段。

步驟 1:修改應用程式程式碼

以下範例顯示如何修改應用程式程式碼,藉以處理 HTTP 401 狀態碼,並為使用者提供工作階段重新整理連結:

if (response.status === 401) {
  statusElm.innerHTML = 'Login stale. <input type="button" value="Refresh" onclick="sessionRefreshClicked();"/>';
}
步驟 2:安裝 onclick 處理常式

以下程式碼範例會安裝 onclick 處理常式,以在重新整理工作階段之後關閉視窗。

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) {
    // Attempting to start a new session.
    // XMLHttpRequests is used by the server to identify AJAX requests
    fetch('/favicon.ico', {
          method: "GET",
          credentials: 'include',
          headers: {
              'X-Requested-With': 'XMLHttpRequest'
          }
    .then((response) => {
      // Checking if browser has a session for the requested app
      if (response.status === 401) {
        // No new session detected. Try to get a session again
        window.setTimeout(checkSessionRefresh, 500);
      } else {
        // Session retrieved.
        iapSessionRefreshWindow.close();
        iapSessionRefreshWindow = null;
      }
    })
    });
  } else {
    iapSessionRefreshWindow = null;
  }
}