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 у middleware 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. Він як охоронець на вході — впускає лише тих, кому ти довіряєш. Особливо це критично, якщо твоє застосунки пов'язані з персональною інформацією, грошима або просто не повинні видавати дані кому попало.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ