1

我部署了一个 3rd 方 webapp,它使用基本身份验证访问Google Cloud Run。我还想通过仅允许组织中经过 Google 身份验证的用户访问来保护端点。这两种方法都使用Authorization请求的标头,我无法让它工作。

我尝试关注这篇文章,在一个字段中提供两个凭据。我的理由是,GCP 应该选择它支持的最强的凭证机制 - 承载 - 并为 webap 保留基本凭证。我不知道 webapp 是否可以处理它,因为谷歌的反向代理已经禁止我访问。

curl "-HAuthorization: bearer ${bearer_token}, basic ${base64_userpw}" https://my-google-endpoint.com

-> 401 未经授权

我也试过Proxy-Authorization没有不同的结果。curl "-HProxy-Authorization: 持有者 ${bearer_token}" "-HAuthorization: basic ${base64_userpw}" https://my-google-endpoint.com

有没有办法让嵌套身份验证与谷歌的反向代理一起工作?我能够通过仅提供承载来绕过反向代理,但自然会在服务中遇到问题。在代理端停用身份验证后,我能够使用基本凭据对服务进行身份验证。

PS:我没有使用浏览器访问 webapp,而是使用命令行工具。

4

2 回答 2

4

您不能将授权机制与 IAP 混合使用。关键字之后的所有内容都bearer被视为令牌字符串。

一种解决方案是将基本授权 HTTP 标头从使用Authorization更改为自定义 HTTP 标头。类似的东西X-MyApp-Authorization。然后您的应用程序处理自定义标头以处理基本授权机制。

[2021-08-17 更新]

我原来的答案是部分错误的。谷歌的解决方案目前已失效。

Cloud Run 支持 Google Cloud IAP。发出请求的客户端可以使用两个 HTTP 授权标头:

  • 授权:<应用授权令牌>
  • 代理授权:承载 < IDENTITY_TOKEN >

如果在Proxy-Authorization标头中找到有效的 ID 令牌,IAP 会使用它授权请求。授权请求后,IAP 将Authorization标头传递给您的应用程序,而不处理内容。

从 Proxy-Authorization 标头进行身份验证

这意味着 OP 使用 Proxy-Authorization 标头在正确的轨道上。但是,此功能不起作用。

创建身份令牌:

使用curl验证令牌是否适用于需要 Invoker 角色的 Cloud Run 端点:

curl -H "Authorization: Bearer $TOKEN" $endpoint

这样可行。现在尝试 Proxy-Authorization 标头:

curl -H "Proxy-Authorization: Bearer $TOKEN" $endpoint

403 失败。

现在尝试两个标题:

curl -H "Proxy-Authorization: Bearer $TOKEN" -H "Authorization: Bearer $ANOTHER_TOKEN" $endpoint

失败并出现 401“无法验证访问令牌”

gcloud auth print-identity-token

我正在使用记录的方法来使用两个授权标头,但是此功能不起作用。

PHP SDK 直到 2021 年 6 月 25 日才添加代理授权标头支持。我根据 Google 的示例创建了一个测试应用程序。这也因同样的错误而失败。

2021 年 6 月 25 日补丁

于 2019-12-12T04:45:58.333 回答
0

如果您发送两个Authorization 标头,它是否会起作用,例如curl -H "Authorization: bearer foo" -H "Authorization: basic bar"

--Matthew,谷歌云 IAP 工程

于 2019-12-12T05:19:52.373 回答