使用外部身份管理会话

本文介绍您使用外部身份进行身份验证时,如何使用 Identity-Aware Proxy (IAP) 管理会话。

刷新会话

Identity Platform 会话的有效期为一小时。会话过期时,您的应用需要重定向到身份验证页面。身份验证页面包含 Identity Platform 刷新令牌。只要用户的凭据仍然有效,您就可以使用它重新进行身份验证,而无需显示任何界面。

如果用户最近更改了他们的电子邮件地址或密码,或者发生了其他撤消其令牌的操作,则他们将需要再次完成身份验证流程。

处理非 AJAX 请求

假设正确配置了身份验证页面,系统会使用应用重定向自动处理非 AJAX 请求。

处理 AJAX 请求

Chrome 浏览器和其他浏览器将逐步停用第三方 Cookie。如果第三方 Cookie 被停用,则在此页面发出 AJAX 请求的建议将不起作用。不过,如果 AJAX 请求的来源和目标都来自同一网站,则提供的建议仍会有效。

如需了解如何在 Chrome 中管理第三方 Cookie,请参阅在 Chrome 中删除、允许和管理 Cookie

如果您发送了一个其令牌已过期的 AJAX 请求,则该请求将返回 401: Unauthorized 状态代码。实施以下解决方案之一来解决此问题:

  • 修改您的应用代码以处理 HTTP 401 状态代码。
  • iframe 添加到您的应用中以指向会话刷新者。
  • 指示您的用户手动将会话刷新者加载到单独标签页中。

如果您收到的是 302 状态代码而不是 401,为了响应 AJAX 请求,请添加一个值为 XMLHttpRequestX-Requested-With 标头。这可向 IAP 通知该请求源自 JavaScript。

以编程方式处理 HTTP 401

建议以编程方式处理 HTTP 401 状态代码来刷新 AJAX 会话。为此,请执行以下操作:

  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 保护的 Web 应用位于同一网域中的位置配置自定义登录页面。否则,用户会遇到跨源错误。如需详细了解登录页面配置,请参阅创建自定义登录页面

iframe 用法示例:

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

加载会话刷新者

作为最后的补救措施,您可以指示用户手动加载会话刷新者。向您的应用或其文档添加指导,指示用户在单独的标签页中打开以下网址:

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

让用户退出账号

如需让用户从 IAP 资源中退出登录,请使用查询参数 ?gcp-iap-mode=GCIP_SIGNOUT。例如,在 App Engine 应用中,网址如下所示:

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

用户在退出登录后将被重定向回登录页面。

如需让用户从所有资源和会话退出登录,请使用 API 密钥将他们重定向到身份验证网址,并附加 mode=signout 作为参数。例如:

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

退出完成后,用户将保留在页面上。建议您在 AuthenticationHandler 对象上实现 completeSignOut() 回调,以向用户提供他们已成功退出的反馈。

在租户之间切换

在某些情况下,用户可能需要向同一 IAP 资源的多个租户进行身份验证。例如,他们可能属于多个租户,这些租户会授予不同级别的访问权限,并且想要切换至具有更少或更多特权的租户。

如需强制重启租户选择流程,请使用 ?gcp-iap-mode=CLEAR_LOGIN_COOKIE。例如,在 App Engine 应用中,网址可能如下所示:

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

后续步骤