【问题标题】:How do you enable CORS requests to a Google Compute Engine IAP enabled Load Balancer?如何启用对启用了 Google Compute Engine IAP 的负载均衡器的 CORS 请求?
【发布时间】:2020-01-25 00:23:14
【问题描述】:

GCP 允许 external HTTPS load balancers to be protected by Identity Aware Proxy (IAP), using your google account credentials to protect 负载均衡器后面的 Web 服务器。这是一种保护您想要在内部使用的 Web 服务的简单方法。但是,有时您需要在另一个域的网站内提供访问权限,例如另一个团队的子域,或者在使用像 Honeycomb.io's Secure Tenancy 这样的第三方服务时。这需要启用Cross-origin resource sharing, or CORS

GCP can be configured to allow CORS requests across IAP,但文档很少。您如何实际启用它?

【问题讨论】:

  • CORS 在浏览器中由浏览器实现。这与 IAP 无关。要发送 CORS 标头,请在 Web 应用程序中执行此操作。不涉及负载均衡器,也不涉及 IAP。你的问题有什么我不明白的地方吗?
  • GCP IAP 默认不允许 CORS OPTIONS 请求。您必须启用它。不幸的是,它还不容易暴露出来。您是正确的,浏览器正在发出这些请求,但后端仍然必须接受这些请求。
  • 安德鲁,很有趣。我会研究你发布的答案。

标签: javascript https google-cloud-platform cors identity-aware-proxy


【解决方案1】:

从 gcloud 277.0 开始,这可以通过 gcloud beta iap settings 命令完成。 Cloud Console 支持即将推出。你想要这样的东西:

cat > settings <<EOF
accessSettings:
  corsSettings:
    allowHttpOptions: true
EOF
gcloud beta iap settings set settings \
  --project=project-id \
  --resource-type=compute \
  --service=backend-service-name

【讨论】:

    【解决方案2】:

    更新: https://twitter.com/mattsachs/status/1220907777247154178?s=19

    此时,GCP 并没有通过Cloud Consolegcloud 命令行工具,或者他们的各种language api libraries 公开这个api。它需要在 VM 实例中使用 curl 之类的内容发出 Web 请求。

    虚拟机创建

    注意:这似乎可以通过 Cloud Shell 完成,无需虚拟机。

    首先,在 GCP 中创建启用 IAP 的外部负载均衡器,并在同一网络中创建一个要连接的 VM 实例。它应该与启用 IAP 的负载均衡器在同一个项目中。 重要提示: 创建 VM 时,请在 Identity and API access>Access scopes 中选择 Allow full access to all Cloud APIs

    通过 SSH 连接到 VM [或 Cloud Shell],并在整个过程的其余部分中将该会话用于 shell 命令。

    变量

    我们将准备以下环境变量(或稍后手动替换值):

    BEARER_TOKEN = OAuth token used in curl API calls
    PROJECT_ID = ID for the compute project
    INSTANCE_ID = ID for the IAP instance
    IAP_NAME = Name for the IAP instance
    

    签名标头 JWT 受众

    • 转到 GCP 控制台 -> 安全性 -> 身份识别代理
    • 找到需要CORS的实例,点击最右边的三个竖点按钮,选择Signed Header JWT Audience
    • 弹出窗口应包含以下路径:/projects/[PROJECT_ID]/global/backendServices/[INSTANCE_ID]
    • 通过在 VM 中运行 shell 命令保存 PROJECT_ID 和 INSTANCE_ID:PROJECT_ID=&lt;PROJECT_ID&gt;INSTANCE_ID=&lt;INSTANCE_ID&gt;

    Shell 命令

    1. 首先,我们将上一步中的 PROJECT_ID 和 INSTANCE_ID 保存到环境变量中(替换为实际值)
    PROJECT_ID=<PROJECT_ID>
    INSTANCE_ID=<INSTANCE_ID>
    
    1. 接下来我们将获得一个用于进行更改的 OAuth 令牌。请注意,您需要足够的权限才能执行此操作。请注意,我们在保存此环境变量时不使用导出;它只能在 shell 会话中访问,其他应用程序不能访问。
    BEARER_TOKEN=`gcloud auth application-default print-access-token`
    
    1. 接下来我们可以构造api中使用的名称/路径:
    INSTANCE_NAME="projects/${PROJECT_ID}/iap_web/compute/services/${INSTANCE_ID}"
    
    1. 接下来我们查询以检查当前设置:
    curl --request GET --header "Accept: application/json" --header "Content-Type: application/json" --header "Authorization: Bearer ${BEARER_TOKEN}" "https://iap.googleapis.com/v1/${INSTANCE_NAME}:iapSettings"
    
    1. 现在我们为更新请求的主体构建 json:
    SETTINGS_BODY='{"name":"'${INSTANCE_NAME}'","accessSettings":{"corsSettings":{"allowHttpOptions":true}}}'
    
    1. 我们现在已准备好更新设置:
    curl --request PATCH --header "Accept: application/json" --header "Content-Type: application/json" --header "Authorization: Bearer ${BEARER_TOKEN}" --data ${SETTINGS_BODY} --compressed "https://iap.googleapis.com/v1/${INSTANCE_NAME}:iapSettings"
    

    这应该返回更新后的设置,类似于第 5 步的输出,但具有新值。

    尽情享受吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 2016-12-05
      相关资源
      最近更新 更多