运行停靠的FastAPI应用程序时的CORS问题 [英] CORS issues when running a dockerised FastAPI application
问题描述
我有一个fastapi
应用程序正在运行并且工作正常。我想使用我的fast api应用程序作为部署在Firebase主机(HTTPS)上的React前端的后端。在本地运行(http fast pi和Reaction)我通过在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集群,并嵌入了我停靠的Fastapi应用程序(公开为HTTPS)。当我卷曲到HTTPS Fastapi端点时,这很管用,但我的Reaction应用程序再次出现CORS问题,这一次我不知道如何解决它。为什么以上规定不再适用?
CORS错误为
CORS策略已阻止访问从源https://my-api-domain‘获取https://my-frontend-domain’:对印前检查请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头。如果不透明的响应满足您的需求,请将请求的模式设置为‘no-CORS’,以在禁用CORS的情况下获取资源。
编辑
我刚刚做了一些进一步的研究,我可以得出结论,如果我用docker run
在本地运行我的容器,那么access-control-allow-origin
在头中正确地返回。但当部署在GKE上时,则没有access-control-allow-origin
。
更新
我曾尝试安装nginx入口,而不是GKE入口,但这会使全局静态IP和Google托管证书的问题复杂化。我需要一个能够为我提供解决方案的解决方案
- 全局静态IP(GKE入口可以)
- Google托管证书(可用于GKE入口)
- CORS已启用(nginx入口可以)
所以我卡在自动取款机上了!
最新更新
我正在使用cert-manager
的Nginx Inress控制器,它的工作方式非常出色。额外信息:用skaffold和kustomize运行一切--有这么多很棒的工具
推荐答案
发布此Community Wiki
以提高可见性,因为comment section
中提到了解决方案。
Google Cloud Platform
上使用CORS
,则必须使用Nginx Ingress
和特定的GCP
注释。有关这方面的更多详细信息,请参阅this SO thread
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-cors: "true"
解决方案
此问题的解决方案是将Nginx Ingress Controller和Cert-Manager与正确的批注一起使用。
操作人员还确认它正在工作。
我将
Nginx Ingress Controller
与cert-manager
配合使用,效果非常出色。额外信息:还可以使用skaffold
和kustomize
运行所有功能-有很多很棒的工具
这篇关于运行停靠的FastAPI应用程序时的CORS问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!