【问题标题】:CORS issues when running a dockerised FastAPI application运行 dockerised FastAPI 应用程序时出现 CORS 问题
【发布时间】: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 和谷歌托管证书方面的事情变得复杂。我需要一个能给我的解决方案

  1. 全局静态 IP(可以使用 GKE 入口)
  2. Google 托管证书(可以使用 GKE 入口)
  3. 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


【解决方案1】:

发布此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 ControllerCert-Manager

OP 也确认它正在工作。

我将Nginx Ingress Controllercert-manager 一起使用,它就像一个魅力。额外信息:使用 skaffoldkustomize 运行所有东西 - 这么多很棒的工具

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 怎么样???它的作品就像一个魅力!但是你怎么解释?
    猜你喜欢
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多