【发布时间】:2020-06-26 02:00:45
【问题描述】:
我有一个fastapi 应用程序正在运行并且工作正常。我想使用我的 fastapi 应用程序作为部署在 firebase 托管 (https) 上的 react 前端的后端。在本地运行(http fastpi 和 react)我通过在 FastAPI 中启用 CORS 使其工作
from starlette.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
但是当我部署时,我意识到我不能将 fastapi 作为 HTTP 服务,因为我的前端是在 HTTPS 上的。我继续在 Google Cloud 中创建了一个 kubernetes 集群,并进入了我的 dockerised fastapi 应用程序(公开为 HTTPS)。当我卷曲到我的 HTTPS fastapi 端点但我在我的反应应用程序中再次遇到 CORS 问题时,这有效,这次我不知道如何解决它。为什么上面的不再适用了?
CORS 错误是
CORS 策略阻止了从源“https://my-api-domain”获取“https://my-api-domain”的访问权限:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
编辑
我刚刚做了一些进一步的调查,我可以得出结论,如果我使用docker run 在本地运行我的容器,那么access-control-allow-origin 会在标头中正确返回。但是当部署在 GKE 上时,则没有 access-control-allow-origin。
更新
我尝试安装 nginx 入口而不是 GKE 入口,但这会使全局静态 IP 和谷歌托管证书方面的事情变得复杂。我需要一个能给我的解决方案
- 全局静态 IP(可以使用 GKE 入口)
- Google 托管证书(可以使用 GKE 入口)
- CORS 已启用(通过 nginx 入口正常)
所以我被卡住了!
最新更新
我正在使用带有cert-manager 的 Nginx Ingress Controller,它的工作原理就像一个魅力。额外信息:使用 skaffold 和 kustomize 运行所有东西 - 这么多很棒的工具
【问题讨论】:
-
浏览器在 devtools 控制台中记录的确切错误消息是什么?
-
@sideshowbarker 我已经提供了带有错误的原始帖子
-
你检查过这个帖子吗? How to enable CORS in GKE ingress
-
是的,而是使用 nginx 入口。而且我不能将 Google 托管证书与 nginx 入口一起使用,这是一项要求
-
是否有任何特殊原因要求 Google 管理的证书?这不能用 gke 集群内的
cert-manager来完成吗?请看这里:Github.com: How to assign a static-ip to an Ingress on through the Nginx controller。如果得出可以使用cert-manager的结论,那么nginx ingress应该满足所有要求。
标签: https cors google-kubernetes-engine