Скрыть схему в FastAPI: сокрытие деталей конечной точки API для повышения безопасности

FastAPI — это современная высокопроизводительная веб-платформа для создания API с помощью Python. Он предлагает широкий спектр функций и преимуществ, включая автоматическое создание документации API с использованием схемы JSON. Однако в некоторых сценариях вам может потребоваться скрыть информацию о схеме конечных точек API, чтобы повысить безопасность и предотвратить потенциальную утечку информации. В этой статье мы рассмотрим несколько методов эффективного сокрытия схемы в FastAPI, сохраняя при этом функциональность вашего API.

Метод 1: модели индивидуального ответа

Один из способов скрыть детали схемы — использовать пользовательские модели ответов. Определив свои собственные модели ответов, вы можете указать только необходимые поля, опуская те, которые хотите скрыть. Давайте рассмотрим пример:

from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
    name: str
    price: float
class HiddenItem(BaseModel):
    name: str
@app.get("/items/{item_id}", response_model=HiddenItem)
async def read_item(item_id: int):
    # Fetch item details from the database
    item = fetch_item_from_db(item_id)
    return HiddenItem(name=item.name)

В приведенном выше фрагменте кода мы определяем две модели Pydantic: Itemи HiddenItem. Модель HiddenItemсодержит только те поля, которые мы хотим предоставить, в данном случае поле name. Указав response_model=HiddenItemдля конечной точки API, FastAPI автоматически сгенерирует документацию со скрытой схемой.

Метод 2: Response_model_exclude_unset

Другой подход — использовать параметр response_model_exclude_unset, который позволяет исключить любые поля, имеющие значения по умолчанию. Вот пример:

from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
    name: str
    price: float
@app.get("/items/{item_id}", response_model=Item, response_model_exclude_unset=True)
async def read_item(item_id: int):
    # Fetch item details from the database
    item = fetch_item_from_db(item_id)
    return item

В этом примере параметр response_model_exclude_unset=Trueисключает из документации API любые поля, имеющие значения по умолчанию. Это эффективно скрывает детали схемы для этих полей.

Метод 3. Пользовательский ответ в формате JSON

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

from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
    # Fetch item details from the database
    item = fetch_item_from_db(item_id)
    response_data = {"name": item.name}
    return JSONResponse(content=response_data)

Создавая ответ вручную и возвращая его в виде ответа JSON с помощью JSONResponse, вы получаете полный контроль над предоставляемыми данными. Это позволяет скрыть из схемы любую конфиденциальную или ненужную информацию.

В этой статье мы рассмотрели три метода, позволяющие скрыть схему в FastAPI и повысить безопасность конечных точек вашего API. Используя настраиваемые модели ответов, исключая неустановленные поля или создавая собственные ответы JSON, вы можете контролировать уровень информации, предоставляемой в документации API. Не забудьте внимательно оценить свои требования к безопасности и выбрать метод, который лучше всего соответствует вашим потребностям.