常见问题解答和问题排查

本文包含有关 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 选项设置为 includesame-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 拥有的网域:

如果您要通过代理服务器或防火墙进行连接,请确保它们允许流向这些网域的流量,并且它们不会阻止使用 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/2235.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/2235.191.0.0/16 无法访问您的后端,则您的应用可能无法访问。如需了解详情,请参阅设置外部 HTTPS 负载均衡器

如果您使用 IAP 通过 TCP 连接到特定虚拟机,则该虚拟机必须接受来自 35.235.240.0/20 范围内的地址的连接。

为什么我时常收到内部服务器错误?

收到 An internal server error occurred while authorizing your request. Error code X 格式的错误消息表示内部故障。错误代码为 130 的内部错误表示后端故障。这些后端错误所占的比例较低通常表示出现暂时性问题。客户端应使用指数退避算法重试请求。

错误代码

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

错误代码或消息 说明 问题排查
错误代码 7 您的 OAuth 客户端 ID 或密钥值为空。 查看“凭据”页面,验证已经为您的应用正确配置了客户端 ID 和密钥。如果似乎正确配置了客户端 ID 和密钥,请使用 GET 方法查看当前状态,使用 PATCH 方法重置客户端 ID 和密钥:
Compute Engine APIGETPATCH
App Engine APIGETPATCH
错误代码 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 APIGETPATCH
App Engine APIGETPATCH
错误代码 13 您的 OpenID Connect (OIDC) 令牌无效。 通过查看“凭据”页面,确保未删除为 IAP 配置的客户端 ID。
错误代码 51 您的浏览器不支持连接池。 最新版浏览器可以处理连接池错误。确保最终用户使用最新版浏览器。有关详情,请参阅限制特定网域访问资源
错误代码 52 提供的主机名与服务器上的 SSL 证书不匹配。 系统管理员可能需要更新 SSL 证书。有关详情,请参阅限制特定网域访问资源
错误代码 53 主机名与 IAP 管理员允许的网域不匹配。 管理员必须更新允许的网域列表,以添加您的主机名。有关详情,请参阅限制特定网域访问资源
错误代码 429 您的项目已超出每分钟的请求数阈值。 IAP 项目的数量上限为每分钟 36 万个请求。如果遇到此错误,请减少项目的请求数。如果您还有其他问题,请联系 Google Cloud 支持团队
错误代码 4003 这可能意味着实例未侦听您尝试连接到的端口,或者防火墙已关闭。 出现上述任何一种问题都同时会导致执行与虚拟机实例之间的启动连接测试失败。 确保虚拟机上的侦听进程正在运行,并且正在侦听正确的端口。另外,请验证您的 Google Cloud 防火墙已正确配置,并且在您要连接到的端口上打开。
错误代码 4010 连接已建立,但被目标实例关闭。这通常表示实例或监听目标端口的程序存在问题。 重置实例。如果您使用 SSH 进行连接,请检查 auth.log 日志是否存在意外错误。日志文件的默认位置为 /var/log/。如果您无法使用 SSH 访问日志,请尝试使用串行控制台将磁盘分离并重新挂接到新的虚拟机以查看日志。与客户支持团队联系时,请附上相关日志。
错误代码 4033 您没有访问该实例的权限、该实例不存在或该实例已停止。 查看 Identity-Aware Proxy 页面,确保对要连接的资源应用了 IAP-secured Tunnel User IAM 角色。
错误代码 4047 实例不存在,或者实例已停止。 确保该虚拟机已启动且已完成其启动。

如果您无法解决问题,请与客户支持团队联系,并提供错误说明以及通过 GET 调用 API 得到的响应。您可以从响应中移除客户端密钥。