常见问题解答和问题排查

本文档包含有关 Identity-Aware Proxy (IAP) 的常见问题解答。

我可以使用 IAP 保护哪些应用?

IAP 可用于:

  • App Engine 标准环境和 App Engine 柔性环境应用
  • 使用 HTTP(S) 负载平衡后端服务的 Compute Engine 实例
  • Google Kubernetes Engine 容器
  • 使用 HTTP(S) 负载均衡后端服务的 Cloud Run 应用

IAP 不能Cloud CDN 搭配使用。

登录我的应用后,为什么网址末尾会有 #?

在某些浏览器中及某些特定情况下,经过身份验证的网址末尾会附加一个 #。这是正常现象,不会引起登录问题。

为什么我的请求失败并返回 405 Method Not Allowed

这种情况通常是由于您的请求没有附加 Cookie。默认情况下,JavaScript 方法不会附加 Cookie。

不同的请求方法需要采用不同的方法:

  • 对于 XMLHttpRequest,将 withCredentials 设置为 true
  • 对于 Fetch API,将 credentials 设置为 includesame-origin

如需了解如何处理与会话相关的错误,请参阅管理 IAP 会话

为什么我收到的是 HTTP 401 Unauthorized,而不是 302 Redirect

仅当您的客户端配置为处理重定向时,IAP 才会发送 302 Redirect

HTTP Accept="text/html,*/*" 添加到请求标头中,以指明支持重定向。

为什么 POST 请求不会触发重定向?

浏览器不会将重定向操作作为对 POST 请求的响应。而是会返回 401 Unauthorized 状态代码。

对于向 IAP 保护的资源发出的 POST 请求,请添加以下任一项:

  • Authorization: Bearer 标头中的 ID 令牌
  • 有效的 Cookie(请参阅刷新会话

如果我已停用 API,是否可以使用 IAP?

是,在停用 API 后,您仍然可以访问受 IAP 保护的资源,但无法修改 IAM 权限。

如何阻止具有 Owner 角色的用户使用 IAP 实现 TCP?

理想情况下,应限制使用 Owner (roles/owner) 角色,而改为使用更精细的权限。如需相关指导,请参阅 IAM 最佳实践

如果无法实现上述方法,您可以使用防火墙规则阻止使用 IAP 实现 TCP。

IAP 使用哪个网域实现 TCP?

IAP 使用以下 Google 自有网域:

为什么我会收到 Server Error

如果您看到以下内容:

The server encountered a temporary error and could not complete your request. Please try again in 30 seconds.

您的防火墙可能屏蔽了负载平衡器 IP。

检查您的防火墙是否允许来自 130.211.0.0/2235.191.0.0/16 的流量。如果这些 IP 无法访问您的后端,您的应用将无法访问。

对于与特定虚拟机的 IAP TCP 连接,还应确保虚拟机接受来自 35.235.240.0/20 范围的连接。

为什么我会间歇性收到内部服务器错误?

An internal server error occurred while authorizing your request. Error code X 等消息表示后端失败。

错误代码 130626364703 通常反映的是暂时性问题。为重试实现指数退避算法。

如何解决配额超出错误 (429)?

如果您的应用超出了 IAP 的请求限制,就会出现错误代码 429。该服务会强制执行单独的配额:

  • 基于浏览器的请求:每个项目每分钟 36 万个
  • 程序化请求:每个项目每分钟 36 万个

程序化请求是指包含 AUTHORIZATIONPROXY-AUTHORIZATION 标头且不包含 IAP Cookie 的请求。所有其他请求(包括没有凭据的请求)都被视为浏览器请求。

这些限制会共同应用于项目中所有受 IAP 保护的资源。

如果您遇到与配额相关的错误,请考虑以下解决方案:

  • 避免在生产环境中进行负载测试 - 使用绕过 IAP 的替代网络路径
  • 对于服务到服务流量,实现指数退避算法以优雅处理 429 错误
  • 将高流量应用分布到多个项目
  • 针对基于 API 的应用使用 Apigee 或类似的 API 网关解决方案
  • 如果是自然增长导致了问题,请与 Google Cloud 支持团队联系以增加配额

错误代码

下表列出了在配置和使用 IAP 时返回的常见错误代码和消息。

错误代码 说明 问题排查
7 OAuth 客户端 ID 或密钥为空 请访问“凭据”页面,验证您的客户端 ID 和密钥。如果这些设置看起来正确无误,但无法正常运行,请使用 API 方法检查设置(对于 Compute Engine 为 GET,对于 App Engine 为 GET),并使用 PATCH 将其重置。
9 OAuth 重定向失败 这是一个已自动记录的内部错误。您无需采取任何行动。
9(使用路径重写规则) OAuth 重定向失败 您的负载平衡器的路径重写规则会阻止 OAuth 流程完成。请确保负载平衡器后面的所有后端都使用相同的 OAuth 客户端 ID。您可以使用 gcloud compute backend-services update 命令进行更新。
9(使用路径路由规则) OAuth 重定向失败 为每个路径的两个版本(带尾斜线和不带尾斜线)创建路径规则变体,并将它们定向到同一后端。例如,同时添加 /path//path 的规则。
11 OAuth 客户端 ID 配置不正确 “凭据”页面中查看您的客户端 ID 和密钥。如果这些设置看起来正确无误,但无法正常运行,请使用 API 方法检查设置(对于 Compute Engine 为 GET,对于 App Engine 为 GET),并使用 PATCH 将其重置。
13 OIDC 令牌无效 前往“凭据”页面,确认您的客户端 ID 未被删除或错误修改。
51 浏览器缺少连接池支持 请最终用户将其浏览器更新到当前版本。如需详细了解连接要求,请参阅限制资源访问
52 主机名/SSL 证书不匹配 您的系统管理员需要更新 SSL 证书,使其与主机名匹配。如需相关指导,请参阅限制资源访问权限
52(包含主证书映射条目) 主机名/SSL 证书不匹配 IAP 不支持主证书映射条目。使用单独的条目将每个证书映射到正确的主机名。如需相关指导,请参阅创建证书映射条目
53 主机名不在允许的网域中 管理员必须将您的主机名添加到允许的网域列表中。如需了解相关说明,请参阅限制资源访问权限
429 超出了请求配额 您已达到请求数上限(每种请求类型每分钟 36 万次)。请考虑将工作负载分布到多个项目中、实现客户端请求节流,或者在需要时与支持团队联系以增加配额,以便实现合法增长。
551 在多个位置启用了 IAP 您无法同时在转发规则和后端服务中启用 IAP。按照为 Compute Engine 启用中的说明,在一个位置停用该功能。
700、701 员工池提供方问题 为员工池配置恰好一个提供方。如需了解详细要求,请参阅劳动力队列限制
705 缺少员工身份的 OAuth 客户端 ID 请按照完整的设置流程操作:先创建 OAuth 客户端 ID,然后更新您的 IAP 设置
708 员工池名称无效 验证您的员工队伍是否存在且格式是否正确:locations/global/workforcePools/WORKFORCE_POOL_ID
4003 连接或防火墙问题 检查您的虚拟机进程是否正在运行,并且是否正在监听预期的端口。此外,请验证您的防火墙规则是否允许在该端口上进行连接。
4010 连接由目的地关闭 重置虚拟机。如果问题仍然存在,请检查 auth.log(通常位于 /var/log/ 中),或使用串行控制台获取更详细的诊断信息。
4033 权限、存在性或虚拟机状态问题 确认您已通过 IAP 页面为资源分配了 Tunnel User 角色,并验证虚拟机是否存在且是否正在运行。
4047 实例不存在或已停止 确保您的虚拟机已启动且已完全完成其启动序列。

如果您无法解决问题,或者您没有在此页面上看到自己的错误,请与 Cloud Customer Care 联系,并提供错误说明以及通过 GET 调用 API 得到的响应。请务必从响应中移除客户端密钥。