条件付き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"
}