コンテンツへスキップ

条件付きOpenAPI

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

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

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

これはAPIに余分なセキュリティを追加するものではなく、パス操作は引き続き利用可能です。

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

ドキュメントを非表示にすると、APIとのやり取り方法を理解するのが難しくなり、本番環境でのデバッグが難しくなる可能性があります。これは単にSecurity through obscurityの一種と見なすことができます。

APIを保護したい場合は、他にもいくつかより良い方法があります。例えば、

  • リクエストボディとレスポンス用に明確に定義されたPydanticモデルがあることを確認してください。
  • 依存関係を使用して、必要な権限とロールを構成します。
  • 平文のパスワードは決して保存せず、パスワードハッシュのみを保存します。
  • pwdlibや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"
}