3 votes

Problèmes de CORS lors de l'exécution d'une application FastAPI dockerisée

J'ai une fastapi application qui fonctionne parfaitement. Je veux utiliser mon application fastapi comme backend pour mon frontend react déployé sur l'hébergement Firebase (https). En exécutant localement (http fastpi et react), j'ai réussi à le faire fonctionner en activant CORS dans FastAPI

from starlette.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

Mais lorsque j'ai déployé, j'ai réalisé que je ne pouvais pas servir fastapi en tant que HTTP car mon frontend est en HTTPS. J'ai donc créé un cluster Kubernetes dans Google Cloud et j'ai exposé mon application fastapi dockerisée (exposée en HTTPS). Cela fonctionne lorsque je fais un curl vers mon point de terminaison fastapi en HTTPS, mais j'ai à nouveau des problèmes de CORS dans mon application react et cette fois-ci je ne sais pas comment le résoudre. Pourquoi la solution ci-dessus ne s'applique-t-elle plus?

L'erreur CORS est

Access to fetch at 'https://my-api-domain' from origin 'https://my-frontend-domain' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

ÉDIT

J'ai fait quelques recherches supplémentaires et je peux conclure que si je lance mon conteneur localement avec docker run, alors access-control-allow-origin est correctement renvoyé dans l'en-tête. Mais lorsqu'il est déployé sur GKE, il n'y a pas de access-control-allow-origin.

MISE À JOUR

J'ai essayé d'installer le contrôleur d'entrée nginx à la place de l'entrée GKE, mais cela complique les choses en ce qui concerne l'IP statique globale et le certificat géré par Google. J'ai besoin d'une solution qui me donne

  1. IP statique globale (ok avec l'entrée GKE)
  2. Certificat géré par Google (ok avec l'entrée GKE)
  3. CORS activé (ok avec l'entrée nginx)

Donc je suis coincé pour le moment!

DERNIÈRE MISE À JOUR

J'utilise le contrôleur d'entrée Nginx avec cert-manager et tout fonctionne parfaitement. Information supplémentaire : tout est exécuté avec skaffold et kustomize également - tellement d'excellents outils

1voto

PjoterS Points 7040

Publier ceci en tant que Community Wiki pour une meilleure visibilité car la solution a été mentionnée dans la section des commentaires.

Si vous souhaitez utiliser CORS sur Google Cloud Platform, vous devez utiliser Nginx Ingress et des annotations spécifiques à GCP. Vous pouvez trouver plus de détails à ce sujet dans ce fil SO

kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-cors: "true"

Solution

La solution à ce problème était d'utiliser un Contrôleur Nginx Ingress et Cert-Manager avec des annotations appropriées.

De plus, l'auteur a confirmé que cela fonctionne.

Je utilise Nginx Ingress Controller avec cert-manager et tout fonctionne parfaitement. Info bonus : j'exécute tout avec skaffold et kustomize également - tant d'excellents outils

0voto

Amar Alikadic Points 1

Ajouter le middleware après le point de terminaison par défaut a résolu le problème pour moi.

app = FastAPI()
@app.get("/")

def home():
return {"message":"Le test de santé a réussi!"}

app.add_middleware(CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X