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
- IP statique globale (ok avec l'entrée GKE)
- Certificat géré par Google (ok avec l'entrée GKE)
- 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