本文包含有关 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(不允许方法)状态代码?
这可能是因为您的请求没有附加 Cookie。默认情况下,JavaScript 方法不会将 Cookie 附加到请求。
添加 Cookie 的方式因请求方法而异。例如,使用 XMLHttpRequest
对象发送的请求需要将 withCredentials
属性设置为 true
,而使用 Fetch API 发送的请求需要将 credentials
选项设置为 include
或 same-origin
。
如需了解如何处理仅在一段时间后才会发生的错误,请参阅管理 IAP 会话。
为什么我会收到 HTTP 401 未经授权的状态代码,而不是 HTTP 302 重定向?
当将客户端配置为处理重定向时,IAP 会返回 302 Redirect
状态代码。为了表明您的客户端可以处理重定向,请确保 HTTP Accept="text/html,*/*"
位于请求的标头中。
为什么 POST 请求不会触发重定向?
如需触发重定向,请确保对 IAP 的调用不是 POST 请求。浏览器不会将重定向操作作为对 POST 请求的响应。因此,IAP 会返回 401 Unauthorized
状态代码,而不是 302 Redirect
。
如果需要 IAP 来处理 POST 请求,请确保在请求的标头中传递 ID 令牌或有效的 Cookie。
在 Authorization: Bearer
标头中包含 ID 令牌以向受 IAP 保护的资源发出经过身份验证的请求。通过刷新会话来获取有效的 Cookie。
如果我已停用 API,是否可以使用 IAP?
是,在停用 API 的情况下,可以访问使用 IAP 保护的资源,但您将无法更改 IAM 权限。
如何限制具有 Owner 角色的用户使用 IAP 实现 TCP?
首先,请尽量避免使用 Owner (roles/owner
) 角色。Owner 角色会在 Google Cloud 中授予广泛的权限。分配更精细的角色和权限可以提高项目的安全性。如需了解详情,请参阅 IAM 最佳做法。
如果您无法减少 Owner 角色的使用,则可以使用防火墙规则阻止使用 IAP 实现 TCP。
IAP 使用哪个网域实现 TCP?
IAP 使用以下归 Google 所有的网域:
tunnel.cloudproxy.app
- 如果启用了基于证书的访问权限,则为
mtls.tunnel.cloudproxy.app
。
如果您通过代理服务器或防火墙进行连接,请确保它们允许流量传输到这些网域,并且不会阻止使用 WebSocket 连接。
如果您阻止到这些网域的流量,则将无法使用 IAP 实现 TCP。您可能会收到以下几种错误消息之一。
如果您使用的是 gcloud
,则错误消息可能是
Error while connecting [[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
如果您使用的是通过浏览器进行 SSH 连接,则错误消息为
Cloud Identity-Aware Proxy Failed
没有相关的错误代码。
为什么我会收到 Server Error
错误?
如果您收到以下错误消息,可能是您的防火墙禁止了 IP 地址 130.211.0.0/22
和 35.191.0.0/16
:
Error: 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/22
和 35.191.0.0/16
无法访问您的后端,则您的应用可能无法访问。如需了解详情,请参阅设置外部 HTTPS 负载均衡器。
如果您使用 IAP for TCP 连接到特定虚拟机,则该虚拟机必须接受来自 35.235.240.0/20
范围内地址的连接。
为什么我会间歇性收到内部服务器错误?
格式如下的错误消息表示内部失败:
An internal server error occurred while authorizing your request. Error code X
错误代码为 1
、30
、62
、63
、64
或 703
的内部错误表示后端失败。这些后端错误的发生率较低通常表示存在暂时性问题。客户端应使用指数退避算法重试请求。
如何解决配额超出错误 (429)?
错误代码 429 表示 IAP 正在限制应用的流量。IAP 强制执行每项目每分钟 36 万个请求的限制。如果单个项目中托管了多个应用,则配额会应用于项目中所有受 IAP 保护的应用收到的请求总数。
如果您遇到了 IAP 超出配额错误,可以参考以下几种方法来缓解此问题。* 不建议在生产实例中进行负载测试。 如果负载增加是由于负载测试造成的,我们建议您找到不调用 IAP 的应用替代网络路径。
如果您的应用收到大量服务到服务流量,我们建议您在客户端实现指数退避算法,以妥善处理 429 错误。
如果同一项目中有多个高流量应用,请考虑将部分应用移至其他项目。
如果应用是作为 API(而非 Web 应用)构建的,请考虑使用 Apigee 等 API 网关解决方案。
如果高流量的原因是自然增长,请与 Google Cloud 支持团队联系,申请提高配额限制。
错误代码
下表列出了在配置和使用 IAP 时返回的常见错误代码和消息。
错误代码或消息 | 说明 | 问题排查 |
---|---|---|
错误代码 7 | 您的 OAuth 客户端 ID 或密钥值为空。 | 查看“凭据”页面,验证已经为您的应用正确配置了客户端 ID 和密钥。如果似乎正确配置了客户端 ID 和密钥,请使用 GET 方法查看当前状态,使用 PATCH 方法重置客户端 ID 和密钥:• Compute Engine API: GET ,PATCH • App Engine API: GET ,PATCH |
错误代码 9 | OAuth 重定向操作未完成。 | 这是一个内部错误,已记录以供审核。 |
错误代码 9(使用路径重写规则) | OAuth 重定向操作未完成。 | Google Cloud 负载平衡器路径重写规则会干扰 IAP 成功完成 OAuth 流程。如果您在 Google Cloud 负载平衡器后面托管多个后端并使用路径重写规则,请确保两个后端都对 IAP 使用相同的 OAuth 客户端 ID。您可以使用 gcloud compute backend-services update 命令更改后端服务的 OAuth 客户端 ID。 |
错误代码 11 | 您的 OAuth 客户端 ID 配置不正确。 | 查看“凭据”页面,验证已经为您的应用正确配置了客户端 ID 和密钥。如果似乎正确配置了客户端 ID 和密钥,请使用 GET 方法查看当前状态,使用 PATCH 方法重置客户端 ID 和密钥:• Compute Engine API: GET ,PATCH • App Engine API: GET ,PATCH |
错误代码 13 | 您的 OpenID Connect (OIDC) 令牌无效。 | 通过查看“凭据”页面,确保未删除为 IAP 配置的客户端 ID。 |
错误代码 51 | 您的浏览器不支持连接池。 | 最新版浏览器可以处理连接池错误。请确保最终用户使用的是最新版浏览器。如需了解详情,请参阅限制对特定网域的资源访问。 |
错误代码 52 | 提供的主机名与服务器上的 SSL 证书不匹配。 | 系统管理员可能需要更新 SSL 证书。如需了解详情,请参阅限制对特定网域的资源访问。 |
错误代码 53 | 主机名与 IAP 管理员允许的网域不匹配。 | 管理员必须更新允许的网域列表,以添加您的主机名。如需了解详情,请参阅限制对特定网域的资源访问。 |
错误代码 429 | 您的项目已超出每分钟请求阈值。 | IAP 项目的数量上限为每分钟 36 万个请求。如果遇到此错误,请减少项目的请求数。如果您还有其他问题,请联系 Google Cloud 支持团队。 |
错误代码 700、701 | 您配置的员工池没有提供方 (700) 或提供方不止一个 (701)。 | IAP 要求员工身份池中必须只有一个提供方才能使用员工身份联合。请参阅使用劳动力池时的限制。 |
错误代码 705 | 用于将 IAP 与员工身份联合搭配使用的 OAuth 客户端 ID 为空。 | 请确保已按照创建 OAuth 客户端 ID 和密钥和更新 IAP 设置步骤操作。 |
错误代码 708 | 您的员工池不存在,或者名称的格式不正确。 | 确保您的员工池存在且名称采用以下格式:locations/global/workforcePools/WORKFORCE_POOL_ID 。 |
错误代码 4003 | 这可能意味着实例未侦听您尝试连接到的端口,或者防火墙已关闭。 出现上述任何一种问题都同时会导致执行与虚拟机实例之间的启动连接测试失败。 | 确保虚拟机上的侦听进程正在运行,并且正在侦听正确的端口。另外,请验证您的 Google Cloud 防火墙已正确配置,并且在您要连接到的端口上打开。 |
错误代码 4010 | 已建立连接,但目标实例将其关闭。这通常表示实例或在目标端口上监听的程序存在问题。 | 重置实例。如果您使用 SSH 进行连接,请检查 auth.log 日志,看看是否存在意外错误。日志文件的默认位置为 /var/log/ 。如果您无法使用 SSH 访问日志,请尝试使用串行控制台或将磁盘分离并重新附加到新的虚拟机以查看日志。与客户服务团队联系时,请附上日志。 |
错误代码 4033 | 您没有访问该实例的权限、该实例不存在或该实例已停止。 | 查看 Identity-Aware Proxy 页面,确保对要连接的资源应用了 IAP-secured Tunnel User IAM 角色。 |
错误代码 4047 | 实例不存在,或者实例已停止。 | 确保该虚拟机已启动且已完成其启动。 |
如果您无法解决问题,或者此页面上未列出您的错误,请与 Cloud Customer Care 联系。请提供错误说明以及您通过 GET
调用 API 获得的响应。请务必从响应中移除客户端密钥。