Browse Source
Co-authored-by: Alexandr <[email protected]> Co-authored-by: Vladislav Kramorenko <[email protected]>pull/9720/head
committed by
GitHub
2 changed files with 85 additions and 0 deletions
@ -0,0 +1,84 @@ |
|||||
|
# CORS (Cross-Origin Resource Sharing) |
||||
|
|
||||
|
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">Понятие CORS или "Cross-Origin Resource Sharing"</a> относится к ситуациям, при которых запущенный в браузере фронтенд содержит JavaScript-код, который взаимодействует с бэкендом, находящимся на другом "источнике" ("origin"). |
||||
|
|
||||
|
## Источник |
||||
|
|
||||
|
Источник - это совокупность протокола (`http`, `https`), домена (`myapp.com`, `localhost`, `localhost.tiangolo.com`) и порта (`80`, `443`, `8080`). |
||||
|
|
||||
|
Поэтому это три разных источника: |
||||
|
|
||||
|
* `http://localhost` |
||||
|
* `https://localhost` |
||||
|
* `http://localhost:8080` |
||||
|
|
||||
|
Даже если они все расположены в `localhost`, они используют разные протоколы и порты, а значит, являются разными источниками. |
||||
|
|
||||
|
## Шаги |
||||
|
|
||||
|
Допустим, у вас есть фронтенд, запущенный в браузере по адресу `http://localhost:8080`, и его JavaScript-код пытается взаимодействовать с бэкендом, запущенным по адресу `http://localhost` (поскольку мы не указали порт, браузер по умолчанию будет использовать порт `80`). |
||||
|
|
||||
|
Затем браузер отправит бэкенду HTTP-запрос `OPTIONS`, и если бэкенд вернёт соответствующие заголовки для авторизации взаимодействия с другим источником (`http://localhost:8080`), то браузер разрешит JavaScript-коду на фронтенде отправить запрос на этот бэкенд. |
||||
|
|
||||
|
Чтобы это работало, у бэкенда должен быть список "разрешённых источников" ("allowed origins"). |
||||
|
|
||||
|
В таком случае этот список должен содержать `http://localhost:8080`, чтобы фронтенд работал корректно. |
||||
|
|
||||
|
## Подстановочный символ `"*"` |
||||
|
|
||||
|
В качестве списка источников можно указать подстановочный символ `"*"` ("wildcard"), чтобы разрешить любые источники. |
||||
|
|
||||
|
Но тогда не будут разрешены некоторые виды взаимодействия, включая всё связанное с учётными данными: куки, заголовки Authorization с Bearer-токенами наподобие тех, которые мы использовали ранее и т.п. |
||||
|
|
||||
|
Поэтому, чтобы всё работало корректно, лучше явно указывать список разрешённых источников. |
||||
|
|
||||
|
## Использование `CORSMiddleware` |
||||
|
|
||||
|
Вы можете настроить этот механизм в вашем **FastAPI** приложении, используя `CORSMiddleware`. |
||||
|
|
||||
|
* Импортируйте `CORSMiddleware`. |
||||
|
* Создайте список разрешённых источников (в виде строк). |
||||
|
* Добавьте его как "middleware" к вашему **FastAPI** приложению. |
||||
|
|
||||
|
Вы также можете указать, разрешает ли ваш бэкенд использование: |
||||
|
|
||||
|
* Учётных данных (включая заголовки Authorization, куки и т.п.). |
||||
|
* Отдельных HTTP-методов (`POST`, `PUT`) или всех вместе, используя `"*"`. |
||||
|
* Отдельных HTTP-заголовков или всех вместе, используя `"*"`. |
||||
|
|
||||
|
```Python hl_lines="2 6-11 13-19" |
||||
|
{!../../../docs_src/cors/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
`CORSMiddleware` использует для параметров "запрещающие" значения по умолчанию, поэтому вам нужно явным образом разрешить использование отдельных источников, методов или заголовков, чтобы браузеры могли использовать их в кросс-доменном контексте. |
||||
|
|
||||
|
Поддерживаются следующие аргументы: |
||||
|
|
||||
|
* `allow_origins` - Список источников, на которые разрешено выполнять кросс-доменные запросы. Например, `['https://example.org', 'https://www.example.org']`. Можно использовать `['*']`, чтобы разрешить любые источники. |
||||
|
* `allow_origin_regex` - Регулярное выражение для определения источников, на которые разрешено выполнять кросс-доменные запросы. Например, `'https://.*\.example\.org'`. |
||||
|
* `allow_methods` - Список HTTP-методов, которые разрешены для кросс-доменных запросов. По умолчанию равно `['GET']`. Можно использовать `['*']`, чтобы разрешить все стандартные методы. |
||||
|
* `allow_headers` - Список HTTP-заголовков, которые должны поддерживаться при кросс-доменных запросах. По умолчанию равно `[]`. Можно использовать `['*']`, чтобы разрешить все заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` и `Content-Type` всегда разрешены для <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">простых CORS-запросов</a>. |
||||
|
* `allow_credentials` - указывает, что куки разрешены в кросс-доменных запросах. По умолчанию равно `False`. Также, `allow_origins` нельзя присвоить `['*']`, если разрешено использование учётных данных. В таком случае должен быть указан список источников. |
||||
|
* `expose_headers` - Указывает любые заголовки ответа, которые должны быть доступны браузеру. По умолчанию равно `[]`. |
||||
|
* `max_age` - Устанавливает максимальное время в секундах, в течение которого браузер кэширует CORS-ответы. По умолчанию равно `600`. |
||||
|
|
||||
|
`CORSMiddleware` отвечает на два типа HTTP-запросов... |
||||
|
|
||||
|
### CORS-запросы с предварительной проверкой |
||||
|
|
||||
|
Это любые `OPTIONS` запросы с заголовками `Origin` и `Access-Control-Request-Method`. |
||||
|
|
||||
|
В этом случае middleware перехватит входящий запрос и отправит соответствующие CORS-заголовки в ответе, а также ответ `200` или `400` в информационных целях. |
||||
|
|
||||
|
### Простые запросы |
||||
|
|
||||
|
Любые запросы с заголовком `Origin`. В этом случае middleware передаст запрос дальше как обычно, но добавит соответствующие CORS-заголовки к ответу. |
||||
|
|
||||
|
## Больше информации |
||||
|
|
||||
|
Для получения более подробной информации о <abbr title="Cross-Origin Resource Sharing">CORS</abbr>, обратитесь к <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">Документации CORS от Mozilla</a>. |
||||
|
|
||||
|
!!! note "Технические детали" |
||||
|
Вы также можете использовать `from starlette.middleware.cors import CORSMiddleware`. |
||||
|
|
||||
|
**FastAPI** предоставляет несколько middleware в `fastapi.middleware` только для вашего удобства как разработчика. Но большинство доступных middleware взяты напрямую из Starlette. |
Loading…
Reference in new issue