管理 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 遵循 Authorization 标头中发送的 JWT 中的 exp 声明。

对于 Identity Platform 登录流程,用户退出后,IAP 会话将保留最长一小时。

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 会话。请注意,对于从 source_domain->target_domain 发送 CORS 请求(其中 target_domain 托管受 IAP 保护的应用)的 AJAX 请求,需要在 target_domain 上建立一个会话。无法在 source_domaintarget_domain 之间共享 Cookie。

target_domain 上建立会话后,开发者就需要启用在请求中发送的凭据。默认情况下,JavaScript 方法不会将 Cookie 附加到请求。如需在请求中启用凭据,使用 XMLHttpRequest 对象发送的请求需要将 withCredentials 属性设为 true,而使用 Fetch API 发送的请求则需要将 credentials 选项设置为 includesame-origin

以下指南建议网络开发者使用一种模式,以便能够成功建立和刷新 IAP 会话。

了解 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) {
    fetch('/favicon.ico').then(function(response) {
      if (response.status === 401) {
        window.setTimeout(checkSessionRefresh, 500);
      } else {
        iapSessionRefreshWindow.close();
        iapSessionRefreshWindow = null;
      }
    });
  } else {
    iapSessionRefreshWindow = null;
  }
}