Aller au contenu

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.

Version anglaise

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://localhost
  • https://localhost
  • http://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ĂȘtes Accept, Accept-Language, Content-Language et Content-Type sont 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Ă©faut False.

    Aucun de allow_origins, allow_methods et allow_headers ne peut ĂȘtre dĂ©fini Ă  ['*'] si allow_credentials est 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Ă©faut 600.

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.