CORS (Partage des ressources entre origines)¶
đ Traduction par IA et humains
Cette traduction a Ă©tĂ© rĂ©alisĂ©e par une IA guidĂ©e par des humains. đ€
Elle peut contenir des erreurs d'interprĂ©tation du sens original, ou paraĂźtre peu naturelle, etc. đ€
Vous pouvez améliorer cette traduction en nous aidant à mieux guider le LLM d'IA.
CORS ou « Cross-Origin Resource Sharing » fait rĂ©fĂ©rence aux situations oĂč un frontend exĂ©cutĂ© dans un navigateur contient du code JavaScript qui communique avec un backend, et oĂč le backend se trouve dans une « origine » diffĂ©rente de celle du frontend.
Origine¶
Une origine est la combinaison du protocole (http, https), du domaine (myapp.com, localhost, localhost.tiangolo.com) et du port (80, 443, 8080).
Ainsi, toutes celles-ci sont des origines différentes :
http://localhosthttps://localhosthttp://localhost:8080
MĂȘme si elles sont toutes sur localhost, elles utilisent des protocoles ou des ports diffĂ©rents, ce sont donc des « origines » diffĂ©rentes.
Ătapes¶
Disons donc que vous avez un frontend exécuté dans votre navigateur à http://localhost:8080, et que son JavaScript essaie de communiquer avec un backend exécuté à http://localhost (comme nous ne spécifions pas de port, le navigateur supposera le port par défaut 80).
Le navigateur enverra alors une requĂȘte HTTP OPTIONS au backend :80, et si le backend envoie les en-tĂȘtes appropriĂ©s autorisant la communication depuis cette origine diffĂ©rente (http://localhost:8080), alors le navigateur :8080 permettra au JavaScript du frontend dâenvoyer sa requĂȘte au backend :80.
Pour y parvenir, le backend :80 doit disposer dâune liste « dâorigines autorisĂ©es ».
Dans ce cas, la liste devrait inclure http://localhost:8080 pour que le frontend :8080 fonctionne correctement.
CaractĂšres gĂ©nĂ©riques¶
Il est également possible de déclarer la liste comme « * » (un « wildcard ») pour indiquer que toutes sont autorisées.
Mais cela nâautorisera que certains types de communication, en excluant tout ce qui implique des informations dâidentification : cookies, en-tĂȘtes Authorization comme ceux utilisĂ©s avec les Bearer Tokens, etc.
Ainsi, pour que tout fonctionne correctement, il est prĂ©fĂ©rable dâindiquer explicitement les origines autorisĂ©es.
Utiliser CORSMiddleware¶
Vous pouvez le configurer dans votre application FastAPI Ă lâaide de CORSMiddleware.
- Importer
CORSMiddleware. - CrĂ©er une liste dâorigines autorisĂ©es (sous forme de chaĂźnes).
- Lâajouter comme « middleware » Ă votre application FastAPI.
Vous pouvez également spécifier si votre backend autorise :
- Les informations dâidentification (en-tĂȘtes Authorization, cookies, etc.).
- Des méthodes HTTP spécifiques (
POST,PUT) ou toutes avec le caractĂšre gĂ©nĂ©rique « * ». - Des en-tĂȘtes HTTP spĂ©cifiques ou tous avec le caractĂšre gĂ©nĂ©rique « * ».
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost.tiangolo.com",
"https://localhost.tiangolo.com",
"http://localhost",
"http://localhost:8080",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def main():
return {"message": "Hello World"}
Les paramĂštres utilisĂ©s par dĂ©faut par lâimplĂ©mentation de CORSMiddleware sont restrictifs, vous devez donc activer explicitement des origines, mĂ©thodes ou en-tĂȘtes particuliers afin que les navigateurs soient autorisĂ©s Ă les utiliser dans un contexte interâdomaine.
Les arguments suivants sont pris en charge :
allow_origins- Une liste dâorigines autorisĂ©es Ă effectuer des requĂȘtes cross-origin. Par ex.['https://example.org', 'https://www.example.org']. Vous pouvez utiliser['*']pour autoriser nâimporte quelle origine.allow_origin_regex- Une chaĂźne regex pour faire correspondre les origines autorisĂ©es Ă effectuer des requĂȘtes cross-origin. Par ex.'https://.*\.example\.org'.allow_methods- Une liste de mĂ©thodes HTTP qui doivent ĂȘtre autorisĂ©es pour les requĂȘtes cross-origin. Par dĂ©faut['GET']. Vous pouvez utiliser['*']pour autoriser toutes les mĂ©thodes standard.allow_headers- Une liste dâen-tĂȘtes HTTP de requĂȘte qui doivent ĂȘtre pris en charge pour les requĂȘtes cross-origin. Par dĂ©faut[]. Vous pouvez utiliser['*']pour autoriser tous les en-tĂȘtes. Les en-tĂȘtesAccept,Accept-Language,Content-LanguageetContent-Typesont toujours autorisĂ©s pour les requĂȘtes CORS simples.-
allow_credentials- Indique que les cookies doivent ĂȘtre pris en charge pour les requĂȘtes cross-origin. Par dĂ©fautFalse.Aucun de
allow_origins,allow_methodsetallow_headersne peut ĂȘtre dĂ©fini Ă['*']siallow_credentialsest dĂ©fini ĂTrue. Ils doivent tous ĂȘtre spĂ©cifiĂ©s explicitement. -
expose_headers- Indique les en-tĂȘtes de rĂ©ponse qui doivent ĂȘtre accessibles au navigateur. Par dĂ©faut[]. max_age- DĂ©finit un temps maximum (en secondes) pendant lequel les navigateurs peuvent mettre en cache les rĂ©ponses CORS. Par dĂ©faut600.
Le middleware rĂ©pond Ă deux types particuliers de requĂȘtes HTTP ...
RequĂȘtes CORS de prĂ©âvĂ©rification¶
Il sâagit de toute requĂȘte OPTIONS avec les en-tĂȘtes Origin et Access-Control-Request-Method.
Dans ce cas, le middleware interceptera la requĂȘte entrante et rĂ©pondra avec les en-tĂȘtes CORS appropriĂ©s, et soit une rĂ©ponse 200, soit 400 Ă titre informatif.
RequĂȘtes simples¶
Toute requĂȘte avec un en-tĂȘte Origin. Dans ce cas, le middleware laissera passer la requĂȘte normalement, mais inclura les en-tĂȘtes CORS appropriĂ©s dans la rĂ©ponse.
En savoir plus¶
Pour plus dâinformations sur CORS, consultez la documentation CORS de Mozilla.
Détails techniques
Vous pouvez également utiliser from starlette.middleware.cors import CORSMiddleware.
FastAPI fournit plusieurs middlewares dans fastapi.middleware uniquement pour votre confort, en tant que développeur. Mais la plupart des middlewares disponibles proviennent directement de Starlette.