Итак, что такое CORS? Представьте, что ваш API — это нечто вроде элитного клуба. Только люди с правильными "ключами" (права доступа) могут войти. Без CORS это больше похоже на вечеринку дома у друга, куда может зайти кто угодно, включая незваных гостей с соседней улицы. CORS позволяет установить правила, кто может делать запросы к вашему API и какие запросы допустимы.
FastAPI, наш удобный "инструментальный ящик", предлагает простую и гибкую настройку CORS. Итак, давайте разберём, как защитить ваш API и разрешить доступ только "правильным" клиентам.
Установка CORS в проекте FastAPI
FastAPI включает интеграцию для управления CORS через встроенную систему middleware. Middleware в данном случае — это своего рода "секретарь", который принимает запросы и проверяет их на соответствие политикам CORS.
Установка зависимостей
Для настройки CORS в FastAPI нам нужна библиотека fastapi. Вы уже должны быть с ней знакомы, поэтому идём дальше!
Убедитесь, что у вас также установлен uvicorn, наш сервер для запуска приложений FastAPI:
pip install fastapi uvicorn
Минимальная конфигурация CORS
Давайте создадим минимальное приложение FastAPI и настроим middleware для поддержки CORS. Начнём с простого примера:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# Настраиваем CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Разрешаем запросы со всех источников (* означает "все")
allow_credentials=True, # Разрешаем отправку куки
allow_methods=["*"], # Разрешаем все HTTP-методы (GET, POST, PUT, DELETE и т.д.)
allow_headers=["*"], # Разрешаем все заголовки
)
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
Сохраните этот файл, запустите сервер с помощью uvicorn, и ваш API теперь готов к приёму кросс-доменных запросов:
uvicorn main:app --reload
Этот пример позволяет всем отправлять запросы к вашему API, что, честно говоря, не очень безопасно. Следующим шагом мы научимся задавать более строгие правила.
Настройка параметров CORS
CORS — это не просто Binary Switch (включить/выключить). Вы можете настроить параметры так, чтобы разрешить только определённые источники, методы или заголовки.
Разрешение только определённых источников
Скажем, у вас есть фронтенд, который запускается на http://localhost:3000. Вы хотите разрешить только этому домену обращаться к вашему API. Вот как это сделать:
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # Разрешаем только этот источник
allow_credentials=True,
allow_methods=["GET", "POST"], # Разрешаем только GET и POST
allow_headers=["*"],
)
Если вы хотите добавить несколько источников, передайте их в виде списка:
allow_origins=["http://localhost:3000", "https://my-production-app.com"]
Поздравляю! Ваш API теперь доступен только "проверенным" источникам. Остальные получат доступ только через слёзы и 403 Forbidden.
Ограничение HTTP-методов
Не все методы должны быть доступны для междоменных запросов. Например, вы можете разрешить только безопасные методы (GET, OPTIONS).
Пример настройки только для этих методов:
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["GET", "OPTIONS"], # Ограничение на методы
allow_headers=["*"],
)
Управление заголовками
Заголовки запросов могут содержать конфиденциальную информацию, поэтому принимайте их с осторожностью. Если вы хотите разрешить только определённые заголовки, задайте их явно:
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["Content-Type", "Authorization"], # Разрешаем только заголовки Content-Type и Authorization
)
Практический пример: API для web-приложения
Допустим, у нас есть фронтенд-приложение, которое запрашивает данные у FastAPI-сервера. Реализуем безопасное взаимодействие.
Настроим сервер FastAPI.
Создайте файл main.py:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# Разрешаем доступ только фронтенд-приложению
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # Только ваш React-frontend
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Content-Type"],
)
@app.get("/data")
async def get_data():
return {"message": "This is the data from the API."}
Вот пример запроса с фронтенда:
async function fetchData() {
const response = await fetch("http://127.0.0.1:8000/data", {
method: "GET",
headers: {
"Content-Type": "application/json",
},
});
const data = await response.json();
console.log(data);
}
fetchData();
Теперь сервер отвечает только на запросы с http://localhost:3000. Если кто-то другой попробует получить доступ, он получит ошибку CORS в консоли браузера.
Общие ошибки и их исправление
Работа с CORS может быть настоящей головной болью даже для опытных разработчиков. Вот несколько распространённых ситуаций:
Ошибка: "CORS policy does not allow access"
Эта ошибка возникает, если выбранный вами домен не включён в allow_origins. Проверьте, какой домен отправляет запрос, и добавьте его.
Ошибка: "Preflight request fails"
Если вы используете методы, кроме GET или POST, браузер отправляет "preflight request" (OPTIONS) для проверки политики CORS. Убедитесь, что методу OPTIONS разрешён доступ, добавив его в allow_methods.
Ошибка: "Blocked by CORS policy: No 'Access-Control-Allow-Origin' header"
Это случается, если ваш сервер не настроен для отправки заголовков CORS. Проверьте вашу конфигурацию middleware.
Настройка CORS может показаться ненужной сложностью, но она помогает защитить ваш API от неподконтрольного использования. Представьте, что какой-то злонамеренный сайт делает запросы от имени пользователя, чтобы украсть его данные. Без CORS ваш сервер предоставил бы доступ злоумышленнику. Так что да, CORS — это не просто "лишний шаг", это фундаментальный элемент безопасности веб-приложений.
FastAPI делает настройку CORS достаточно простой и гибкой, чтобы справиться с различными сценариями. Теперь вы вооружены всеми необходимыми знаниями, чтобы настроить свой API для работы с фронтендом, сохраняя при этом высокий уровень безопасности.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ