Zum Inhalt

Bedingte OpenAPI

Bei Bedarf können Sie OpenAPI mithilfe von Einstellungen und Umgebungsvariablen abhängig von der Umgebung bedingt konfigurieren und sogar vollständig deaktivieren.

Über Sicherheit, APIs und Dokumentation

Das Verstecken Ihrer Dokumentationsoberflächen in der Produktion sollte nicht die Methode sein, Ihre API zu schützen.

Dadurch wird Ihrer API keine zusätzliche Sicherheit hinzugefügt, die Pfadoperationen sind weiterhin dort verfügbar, wo sie sich befinden.

Wenn Ihr Code eine Sicherheitslücke aufweist, ist diese weiterhin vorhanden.

Das Verstecken der Dokumentation macht es nur schwieriger zu verstehen, wie mit Ihrer API interagiert werden kann, und könnte es auch schwieriger machen, diese in der Produktion zu debuggen. Man könnte es einfach als eine Form von Security through obscurity betrachten.

Wenn Sie Ihre API sichern möchten, gibt es mehrere bessere Dinge, die Sie tun können, zum Beispiel:

  • Stellen Sie sicher, dass Sie über gut definierte Pydantic-Modelle für Ihre Requestbodys und Responses verfügen.
  • Konfigurieren Sie alle erforderlichen Berechtigungen und Rollen mithilfe von Abhängigkeiten.
  • Speichern Sie niemals Klartext-Passwörter, sondern nur Passwort-Hashes.
  • Implementieren und verwenden Sie gängige kryptografische Tools wie Passlib und JWT-Tokens, usw.
  • Fügen Sie bei Bedarf detailliertere Berechtigungskontrollen mit OAuth2-Scopes hinzu.
  • ... usw.

Dennoch kann es sein, dass Sie einen ganz bestimmten Anwendungsfall haben, bei dem Sie die API-Dokumentation für eine bestimmte Umgebung (z. B. für die Produktion) oder abhängig von Konfigurationen aus Umgebungsvariablen wirklich deaktivieren müssen.

Bedingte OpenAPI aus Einstellungen und Umgebungsvariablen

Sie können problemlos dieselben Pydantic-Einstellungen verwenden, um Ihre generierte OpenAPI und die Dokumentationsoberflächen zu konfigurieren.

Zum Beispiel:

from fastapi import FastAPI
from pydantic_settings import BaseSettings


class Settings(BaseSettings):
    openapi_url: str = "/openapi.json"


settings = Settings()

app = FastAPI(openapi_url=settings.openapi_url)


@app.get("/")
def root():
    return {"message": "Hello World"}

Hier deklarieren wir die Einstellung openapi_url mit dem gleichen Defaultwert "/openapi.json".

Und dann verwenden wir das beim Erstellen der FastAPI-App.

Dann könnten Sie OpenAPI (einschließlich der Dokumentationsoberflächen) deaktivieren, indem Sie die Umgebungsvariable OPENAPI_URL auf einen leeren String setzen, wie zum Beispiel:

$ OPENAPI_URL= uvicorn main:app

<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Wenn Sie dann zu den URLs unter /openapi.json, /docs oder /redoc gehen, erhalten Sie lediglich einen 404 Not Found-Fehler, wie:

{
    "detail": "Not Found"
}