本文介绍您使用外部身份进行身份验证时,如何使用 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 请求,请添加一个值为 XMLHttpRequest
的 X-Requested-With
标头。这可向 IAP 通知该请求源自 JavaScript。
以编程方式处理 HTTP 401
建议以编程方式处理 HTTP 401
状态代码来刷新 AJAX 会话。为此,请执行以下操作:
更新您的应用代码以处理该错误。
添加一个处理程序,该处理程序会打开一个窗口以对用户重新进行身份验证,然后在此过程完成时将其关闭。
使用 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