コンテンツにスキップ

条件付き OpenAPI

必要に応じて、設定と環境変数を使用して、環境に応じて OpenAPI を条件付きで設定し、完全に無効にすることもできます。

セキュリティ、API、ドキュメントについて

本番環境でドキュメント ユーザー インターフェースを非表示にすることは、API を保護する方法としてあるべきではありません

それは API にセキュリティを追加するものではなく、パス操作は依然としてそこにある場所で利用可能です。

コードにセキュリティ上の欠陥がある場合、それは依然として存在します。

ドキュメントを非表示にすると、API との対話方法の理解が難しくなり、本番環境でのデバッグが難しくなる可能性があります。それは単にあいまいさによるセキュリティの一形態と見なされる可能性があります。

API を保護したい場合は、他にもできることがいくつかあります。たとえば、

  • リクエスト本文とレスポンスに適切に定義された Pydantic モデルがあることを確認してください。
  • 依存関係を使用して、必要な権限とロールを設定します。
  • プレーンテキストのパスワードを保存しないでください。パスワード ハッシュのみを保存してください。
  • Passlib や JWT トークンなどのよく知られた暗号化ツールを実装して使用します。
  • 必要に応じて、OAuth2 スコープを使用して、よりきめ細かい権限制御を追加します。
  • ...など。

それでも、特定のユースケースがあり、何らかの環境(たとえば、本番環境)で、または環境変数からの設定に応じて、API ドキュメントを実際に無効にする必要がある場合があります。

設定と環境変数からの条件付き OpenAPI

同じ Pydantic 設定を使用して、生成された OpenAPI とドキュメント UI を簡単に設定できます。

たとえば、

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"}

ここでは、"/openapi.json" と同じデフォルトで設定 openapi_url を宣言しています。

そして、FastAPI アプリを作成するときにそれを使用します。

次に、環境変数 OPENAPI_URL を空の文字列に設定することで、OpenAPI (UI ドキュメントを含む) を無効にすることができます。たとえば、

$ 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)

その後、/openapi.json/docs、または /redoc の URL にアクセスすると、次のような 404 Not Found エラーが表示されます。

{
    "detail": "Not Found"
}