JavaRush /Курсы /Модуль 4: FastAPI /Настройка допустимых методов и источников

Настройка допустимых методов и источников

Модуль 4: FastAPI
21 уровень , 3 лекция
Открыта

CORS позволяет вам управлять тем, какие веб-сайты (источники) могут обращаться к вашему API и какие HTTP-методы (например, GET, POST, PUT, DELETE) можно использовать при этих запросах. Эта настройка важна, чтобы предотвратить несанкционированный доступ к вашему API и обеспечить безопасность данных.

Например, вы можете разрешить доступ только из определённого домена (например, https://myfrontend.com) и только для методов GET и POST. Таким образом, ваш API будет работать только с доверенными источниками и ограничивать действия, которые могут быть выполнены.


Ограничение HTTP-методов

Давайте разберем, почему и как ограничивать HTTP-методы. Представьте себе это как чат с ботом: "Вы хотите, чтобы он отвечал на все запросы пользователей? Или только на те, которые для него релевантны?".

Разрешение всех методов (например, PUT, DELETE, PATCH и т.д.) может быть избыточным и небезопасным. Например, если ваш API предоставляет только возможность чтения данных через GET, другие методы должны быть запрещены, чтобы минимизировать риски эксплуатации уязвимостей.

Настройка методов в FastAPI

FastAPI значительно упрощает настройку CORS. Для работы с методами мы используем параметр allow_methods в миддлваре CORSMiddleware.

Пример: разрешим только методы GET и POST.


from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# Настройка CORS
origins = [
    "https://myfrontend.com",  # Разрешить запросы только с этого домена
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # Источники, откуда разрешены запросы
    allow_methods=["GET", "POST"],  # Разрешённые методы запросов
    allow_headers=["*"],  # Разрешённые заголовки
)

@app.get("/")
async def read_root():
    return {"Hello": "World"}

В этом примере:

  • API принимает запросы только из https://myfrontend.com.
  • Только методы GET и POST разрешены.

Попробуйте отправить запрос с методом DELETE или PUT — браузер заблокирует его.


Управление источниками запросов

Теперь поговорим о том, как управлять "источниками" (origins). Источник определяется как комбинация:

  • Схема (например, http или https).
  • Домен (например, example.com).
  • Порт (например, :3000).

Пример источника: https://myfrontend.com:3000

Ограничение источников позволяет защитить ваш API от доступа с недоверенных доменов. Например, если API должен быть доступен только вашему фронтенду, можно добавить его домен в "белый список" (allow_origins). Все остальные запросы будут отклонены.

Настройка источников в FastAPI

Для настройки параметра allow_origins мы указываем список разрешенных доменов.

Пример: разрешим запросы только с конкретных доменов.


app.add_middleware(
    CORSMiddleware,
    allow_origins=[
        "https://myfrontend.com",  # Основной фронтенд
        "https://admin.myfrontend.com",  # Панель администратора
    ], 
    allow_methods=["GET", "POST"],  # Методы
    allow_headers=["*"],  # Все заголовки
)

Теперь только указанные домены смогут обращаться к API. Если запрос придет с другого источника, браузер заблокирует его с ошибкой CORS.


Использование wildcard (*)

Иногда нужно разрешить запросы с любого домена (например, если вы разрабатываете публичное API). В таких случаях можно использовать * (wildcard).

Пример: разрешим запросы с любого источника.


app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Разрешить запросы с любого источника
    allow_methods=["GET", "POST", "DELETE"],
    allow_headers=["*"],
)

Это избавляет вас от необходимости перечислять домены вручную. Однако использовать * нужно с осторожностью, так как это увеличивает вероятность несанкционированного доступа.


Примеры сложных конфигураций

  • Разрешение методов и источников для разных сред

Представим себе ситуацию: в процессе разработки вы работаете с локальным фронтендом (http://localhost:3000), но в продакшене используете другой домен (https://myfrontend.com). Вы хотите разрешить запросы только из этих источников.

Решение:


import os

# Определяем текущую среду
ENVIRONMENT = os.getenv("ENVIRONMENT", "development")

if ENVIRONMENT == "production":
    origins = ["https://myfrontend.com"]
else:
    origins = ["http://localhost:3000"]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_methods=["GET", "POST", "PUT", "DELETE"],
    allow_headers=["*"],
)

Теперь окружение (ENVIRONMENT) определяет, какие источники разрешены.

  • Настройка политики для REST API

Если у вас REST API и требуется разрешить только "чтение" (GET) для публичных данных и "запись" (POST, PUT, DELETE) только для авторизованных пользователей, вы можете разделить настройки.


app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://public-api.com"],
    allow_methods=["GET"],  # Только GET для публичных запросов
    allow_headers=["*"],
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://admin-api.com"],
    allow_methods=["POST", "PUT", "DELETE"],  # Методы записи для админов
    allow_headers=["*"],
)

Проблемы и диагностика

Иногда при настройке CORS вы можете столкнуться с проблемами. Например:

  1. Ошибка в браузере: "No 'Access-Control-Allow-Origin' header is present on the requested resource".
    Это означает, что источник запроса не указан в allow_origins или запрос поступил с недоверенного домена.
  2. Ошибка при предварительном запросе (preflight): "CORS preflight channel did not succeed".
    Это может быть связано с неверной настройкой методов в allow_methods или заголовков в allow_headers.

Используйте DevTools в вашем браузере, чтобы отладить запросы, и проверяйте заголовки Access-Control-Allow-Origin и Access-Control-Allow-Methods в ответах сервера.


Зачем это нужно на практике?

В реальной жизни всё не так просто: если разрешить любому отправлять запросы к вашему серверу, это может обернуться серьёзными проблемами. Например, злоумышленник может заставить браузер пользователя отправлять запросы от его имени, или перехватить чувствительные данные, если доступ открыт с подозрительных сайтов.

Именно поэтому важно настраивать CORS. Он как охранник на входе — пускает только тех, кому вы доверяете. Особенно это критично, если ваше приложение связано с личной информацией, деньгами или просто не должно выдавать данные кому попало.

1
Задача
Модуль 4: FastAPI, 21 уровень, 3 лекция
Недоступна
Настройка CORS для разрешения локального фронтенда
Настройка CORS для разрешения локального фронтенда
1
Задача
Модуль 4: FastAPI, 21 уровень, 3 лекция
Недоступна
Разделение CORS-настроек для разработки и продакшена
Разделение CORS-настроек для разработки и продакшена
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ