|
| 1 | +# CORS (Cross-Origin Resource Sharing) |
| 2 | + |
| 3 | +<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS oder "Cross-Origin Resource Sharing"</a> |
| 4 | +beschreibt die Situation, wenn ein Frontend (aus JavaScript-Code), das in einem Browser läuft und mit einem Backend kommuniziert, welches in einem anderen "Ursprung" als das Frontend ist. |
| 5 | + |
| 6 | +## Ursprung |
| 7 | + |
| 8 | +Der Ursprung ist die Kombination aus Protokoll (`http`, `https`), Domain (`myapp.com`, `localhost`, `localhost.tiangolo.com`) und Port (`80`, `443`, `8080`). |
| 9 | + |
| 10 | +So sind alle diese unterschiedliche Ursprünge: |
| 11 | + |
| 12 | +* `http://localhost` |
| 13 | +* `https://localhost` |
| 14 | +* `http://localhost:8080` |
| 15 | + |
| 16 | +Sogar wenn sie alle in `localhost` sind, verwenden sie unterschiedliche Protokolle oder Ports, also sind sie unterschiedliche "Ursprünge". |
| 17 | + |
| 18 | +## Schritte |
| 19 | + |
| 20 | +Angenommen, Sie haben eine Frontend-Anwendung, die in Ihrem Browser unter `http://localhost:8080` läuft, und ihr JavaScript versucht, mit einem Backend unter `http://localhost` zu kommunizieren (da wir keinen Port angeben, geht der Browser vom Standardport `80` aus). |
| 21 | + |
| 22 | +Dann sendet der Browser eine HTTP `OPTIONS`-Anfrage an das Backend, und wenn das Backend die entsprechenden Header sendet, die die Kommunikation von diesem anderen Ursprung (`http://localhost:8080`) autorisieren, lässt der Browser das JavaScript im Frontend seine Anfrage an das Backend senden. |
| 23 | + |
| 24 | + |
| 25 | +Um dies zu erreichen, muss das Backend eine Liste der "erlaubten Ursprünge" haben. |
| 26 | + |
| 27 | +In diesem Fall müsste es `http://localhost:8080` für das Frontend enthalten, um korrekt zu funktionieren. |
| 28 | + |
| 29 | +## Wildcards |
| 30 | + |
| 31 | +Es ist auch möglich, die Liste als `"*"` (ein "Wildcard") zu deklarieren, um zu sagen, dass alle erlaubt sind. |
| 32 | + |
| 33 | +Aber dies wird nur bestimmte Arten von Kommunikation erlauben, wobei alles ausgeschlossen wird, was Anmeldeinformationen beinhaltet: Cookies, Autorisierungs-Header wie die mit Bearer Tokens verwendet werden, etc. |
| 34 | + |
| 35 | +Um alles richtig funktionieren zu lassen, ist es besser, die erlaubten Ursprünge explizit anzugeben. |
| 36 | + |
| 37 | +## Verwende `CORSMiddleware` |
| 38 | + |
| 39 | +Du kannst es in deiner **FastAPI**-Anwendung mit der `CORSMiddleware` konfigurieren. |
| 40 | + |
| 41 | +* Importiere `CORSMiddleware`. |
| 42 | +* Erstelle eine Liste der erlaubten Ursprünge (als strings). |
| 43 | +* Füge es als "Middleware" zu deiner **FastAPI**-Anwendung hinzu. |
| 44 | + |
| 45 | +Du kannst auch angeben, ob dein Backend erlaubt: |
| 46 | + |
| 47 | +* Zugangsdaten (Autorisierungs-Header, Cookies, etc). |
| 48 | +* Spezifische HTTP-Methoden (`POST`, `PUT`) oder alle mit dem Wildcard `"*"`. |
| 49 | +* Spezifische HTTP-Header oder alle mit dem Wildcard `"*"`. |
| 50 | + |
| 51 | +```Python hl_lines="2 6-11 13-19" |
| 52 | +{!../../../docs_src/cors/tutorial001.py!} |
| 53 | +``` |
| 54 | + |
| 55 | +Der Standardparameter, der von der `CORSMiddleware`-Implementierung verwendet wird, ist standardmäßig restriktiv, so dass du bestimmte Ursprünge, Methoden oder Header explizit aktivieren musst, damit Browser sie in einem Cross-Domain-Kontext verwenden dürfen. |
| 56 | + |
| 57 | +Die folgenden Argumente werden unterstützt: |
| 58 | + |
| 59 | +* `allow_origins` - Eine Liste von Ursprüngen, die berechtigt sein sollten, Cross-Origin-Anfragen zu stellen. Z.B. `['https://example.org', 'https://www.example.org']`. Du kannst `['*']` verwenden, um jeden Ursprung zu erlauben. |
| 60 | +* `allow_origin_regex` - Ein Regex-String, der mit Ursprüngen übereinstimmt, die berechtigt sein sollten, Cross-Origin-Anfragen zu stellen. z.B. `'https://.*\.example\.org'`. |
| 61 | +* `allow_methods` - Eine Liste von HTTP-Methoden, die für Cross-Origin-Anfragen erlaubt sein sollten. Standardmäßig auf `['GET']` gesetzt. Du kannst `['*']` verwenden, um alle Standardmethoden zu erlauben. |
| 62 | +* `allow_headers` - Eine Liste von HTTP-Anfrage-Headern, die für Cross-Origin-Anfragen unterstützt werden sollten. Standardmäßig auf `[]` gesetzt. Du kannst `['*']` verwenden, um alle Header zu erlauben. Die Header `Accept`, `Accept-Language`, `Content-Language` und `Content-Type` sind immer für <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">einfache CORS-Anfragen</a> erlaubt. |
| 63 | +* `allow_credentials` - Bestimmt das Cookies für Cross-Origin-Anfragen unterstützt werden sollen. Standardmäßig auf `False` gesetzt. Außerdem kann `allow_origins` nicht auf `['*']` gesetzt werden, damit Anmeldeinformationen erlaubt werden, Ursprünge müssen angegeben werden. |
| 64 | +* `expose_headers` - Bestimt welche Antwort-Header für den Browser zugänglich gemacht werden sollen. Standardmäßig auf `[]` gesetzt. |
| 65 | +* `max_age` - Legt eine maximale Zeit in Sekunden fest, die Browser verwenden, um CORS-Antworten zu cachen. Standardmäßig auf `600` gesetzt. |
| 66 | + |
| 67 | +Die Middleware reagiert auf zwei bestimmte Arten von HTTP-Anfragen... |
| 68 | + |
| 69 | +### CORS Preflight-Anfragen |
| 70 | + |
| 71 | +Dies sind alle `OPTIONS`-Anfragen mit `Origin` und `Access-Control-Request-Method`-Headern. |
| 72 | + |
| 73 | +In diesem Fall kann die Middleware die eingehende Anfrage abfangen und mit entsprechenden CORS-Headern antworten, und entweder eine `200` oder `400`-Antwort zu Informationszwecken senden. |
| 74 | + |
| 75 | +### Einfache Anfragen |
| 76 | + |
| 77 | +Jede Anfrage mit einem `Origin`-Header. In diesem Fall wird die Middleware die Anfrage wie gewohnt weiterleiten, aber die entsprechenden CORS-Header in der Antwort enthalten. |
| 78 | + |
| 79 | +## Weitere Informationen |
| 80 | + |
| 81 | +Für weitere Informationen zu <abbr title="Cross-Origin Resource Sharing">CORS</abbr>, gehe auf die <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">Mozilla CORS Dokumentation</a>. |
| 82 | + |
| 83 | +!!! note "Technische Details" |
| 84 | + Du kannst auch `from starlette.middleware.cors import CORSMiddleware` verwenden. |
| 85 | + |
| 86 | + **FastAPI** stellt mehrere Middlewares in `fastapi.middleware` als Annehmlichkeit für Sie, den Entwickler. Die meisten der verfügbaren Middlewares kommen jedoch direkt von Starlette. |
0 commit comments