Https 运行停靠的FastAPI应用程序时出现CORS问题

Https 运行停靠的FastAPI应用程序时出现CORS问题,https,cors,google-kubernetes-engine,Https,Cors,Google Kubernetes Engine,我有一个应用程序正在运行,工作正常。我想使用fastapi应用程序作为部署在firebase主机(https)上的react前端的后端。在本地运行(http fastpi和react),我通过在FastAPI中启用CORS使其工作 从starlette.middleware.cors导入CORSMiddleware app.add\u中间件( Corsmidware, 允许_origins=[“*”], allow_credentials=True, 允许_方法=[“*”], 允许_头=[“*”

我有一个应用程序正在运行,工作正常。我想使用fastapi应用程序作为部署在firebase主机(https)上的react前端的后端。在本地运行(http fastpi和react),我通过在FastAPI中启用CORS使其工作

从starlette.middleware.cors导入CORSMiddleware
app.add\u中间件(
Corsmidware,
允许_origins=[“*”],
allow_credentials=True,
允许_方法=[“*”],
允许_头=[“*”],
)
但当我部署时,我意识到我不能将fastapi作为HTTP提供服务,因为我的前端是HTTPS。我继续在谷歌云中创建了一个kubernetes集群,并进入了我的对接fastapi应用程序(公开为HTTPS)。当我卷曲到我的HTTPS fastapi端点时,这是可行的,但我在react应用程序中再次遇到CORS问题,这次我不知道如何解决它。为什么上述情况不再适用

CORS错误是

在'https://my-api-domain“起源”https://my-frontend-domain'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

编辑 我只是做了一些进一步的调查,我可以得出结论,如果我使用
docker run
在本地运行我的容器,那么
access control allow origin
会正确地返回到标题中。但当部署在GKE上时,则没有
访问控制允许源站

更新 我尝试过安装nginx-ingres而不是GKE-ingres,但这使全局静态IP和谷歌托管证书的问题变得复杂。我需要一个能让我

  • 全局静态IP(GKE入口正常)
  • Google托管证书(使用GKE入口可以)
  • CORS已启用(nginx入口正常)
  • 所以我被卡在自动取款机上了

    最新更新
    我正在使用带有
    cert manager
    的Nginx入口控制器,它就像一个魔咒。额外信息:使用skaffold和kustomize运行所有内容-许多很棒的工具

    发布此
    社区Wiki
    ,以获得更好的可视性,正如
    评论部分提到的解决方案一样

    如果您想在
    Google云平台上使用
    CORS
    ,您必须使用
    Nginx入口
    和特定的
    GCP
    注释。有关这方面的更多详细信息,请参阅

    解决方案

    这个问题的解决方案是使用和添加适当的注释

    同时,OP也证实了它的工作

    我正在使用
    Nginx入口控制器
    cert-manager
    配合使用,它就像一个魔咒。额外信息:使用
    skaffold
    kustomize
    运行所有东西-这么多很棒的工具


    在默认端点之后添加中间件为我解决了这个问题

    app = FastAPI()
    @app.get("/")
    
    def home():
    return {"message":"Health Check Passed!"}
    
    app.add_middleware(CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],)
    

    浏览器在devtools控制台中记录的确切错误消息是什么?@sideshowbarker我已经在原始帖子中提供了错误消息。您检查过这个线程吗?是,它使用nginx入口。我不能将Google托管证书与nginx ingress一起使用,这是一项要求。Google托管证书是一项要求有什么特殊原因吗?例如,在gke集群内部使用
    cert manager
    就不能做到这一点吗?请看这里:。如果得出结论认为可以使用
    证书管理器
    ,nginx入口应满足所有要求。
    app = FastAPI()
    @app.get("/")
    
    def home():
    return {"message":"Health Check Passed!"}
    
    app.add_middleware(CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],)