mr.*_*rre 7 https cors google-kubernetes-engine
我有一个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=["*"],
)
Run Code Online (Sandbox Code Playgroud)
但是当我部署时,我意识到我无法将 fastapi 作为 HTTP 提供服务,因为我的前端位于 HTTPS 上。我继续在 Google Cloud 中创建了一个 kubernetes 集群,并进入了我的 dockerized fastapi 应用程序(公开为 HTTPS)。当我卷曲到我的 HTTPS fastapi 端点时,这是有效的,但我在我的 React 应用程序中再次遇到 CORS 问题,这次我不知道如何解决它。为什么上面的内容不再适用?
CORS 错误是
从源“https://my-frontend-domain”获取“https://my-api-domain”的访问已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:无“访问” -Control-Allow-Origin'标头存在于所请求的资源上。如果不透明响应满足您的需求,请将请求模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。
我刚刚做了一些进一步的调查,我可以得出结论,如果我在本地运行我的容器,docker run那么access-control-allow-origin会在标头中正确返回。但是当部署在 GKE 上时,就没有access-control-allow-origin.
我尝试安装 nginx ingress 而不是 GKE ingress,但这使全局静态 IP 和 google 托管证书方面的事情变得复杂。我需要一个可以给我的解决方案
所以我被自动取款机困住了!
我正在使用 Nginx Ingress Controller cert-manager,它的工作方式就像一个魅力。额外信息:使用 skaffold 和 kustomize 运行所有内容 - 这么多很棒的工具
发布此内容Community Wiki是为了获得更好的可见性,因为解决方案已在 中提到comment section。
如果你想使用CORSon Google Cloud Platform,你必须使用Nginx Ingress特定的GCP注释。有关此内容的更多详细信息,您可以在此 SO 线程中找到
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-cors: "true"
Run Code Online (Sandbox Code Playgroud)
解决方案
此问题的解决方案是使用Nginx Ingress Controller和Cert-Manager以及适当的注释。
OP 也确认它正在工作。
我正在使用
Nginx Ingress Controllerwithcert-manager,它就像一个魅力。额外信息:使用skaffold和运行所有kustomize内容 - 这么多很棒的工具
| 归档时间: |
|
| 查看次数: |
6563 次 |
| 最近记录: |