【问题标题】:Using nested authentication with Google IAP通过 Google IAP 使用嵌套身份验证
【发布时间】:2020-04-05 09:45:29
【问题描述】:

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

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

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

-> 401 未经授权

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

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

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

【问题讨论】:

  • IAP 在哪里? Cloud Run 前面?
  • 我可能在术语上弄错了。我将 Cloud Run 配置为仅允许经过身份验证的访问,并假设它与 IAP 的原理相同。

标签: google-cloud-platform authorization google-cloud-run google-iap


【解决方案1】:

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

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

[2021-08-17 更新]

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

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

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

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

Authenticating from Proxy-Authorization Header

这意味着 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

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

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

June 25, 2021 Patch

【讨论】:

  • 感谢您的建议。我拿了服务的 Dockerfile 并部署了它。因此,我没有深入研究重新配置 uwsgi 服务。
  • 谢谢,我花了太多时间重做所有事情后发现,我的配置使用常规授权密钥可以正常工作。我打算从一开始就使用代理授权,因为应用程序需要内部授权,但使用自定义标头似乎是一个不错的解决方案。
  • 复制了相同的损坏功能并将其记录在 Google 的 IssueTracker 中,如果您想继续关注:issuetracker.google.com/issues/214408198
【解决方案2】:

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

--Matthew,Google Cloud IAP 工程

【讨论】:

  • 许多框架/库使用字典来存储标头。另外,您不能有两个同名的 HTTP 标头。
  • 最好将此作为评论添加,因为它不是答案。
  • @Matthew 当您在 Authorization 标头中传入基本身份验证令牌并在 Proxy-Authorization 中传入 IAP JWT 令牌时,它可以工作。如果 Authorization 标头包含另一个 JWT 令牌,则 IAP 失败。
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2011-03-18
  • 2023-04-06
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多