コンテンツへスキップ

条件付き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_url"/openapi.json"と同じデフォルトで宣言しています。

そして、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"
}