跳至內容

條件式 OpenAPI

如果需要,您可以使用設定和環境變數根據環境條件設定 OpenAPI,甚至完全停用它。

關於安全性、API 和文件

在生產環境中隱藏您的文件使用者介面不應該是保護 API 的方法。

這不會為您的 API 增加任何額外的安全性,路徑操作仍然在其所在位置可用。

如果您的程式碼中存在安全漏洞,它仍然會存在。

隱藏文件只會讓理解如何與您的 API 互動變得更加困難,並且可能會讓您在生產環境中更難以除錯。它可以被簡單地視為一種透過隱藏來實現安全性的形式。

如果您想要保護您的 API,您可以做一些更好的事情,例如:

  • 確保您為請求主體和回應定義了完善的 Pydantic 模型。
  • 使用 dependencies 設定任何所需的權限和角色。
  • 永遠不要儲存明文密碼,只儲存密碼雜湊值。
  • 實作和使用知名的加密工具,例如 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 的網址,您只會收到 404 Not Found 錯誤,例如:

{
    "detail": "Not Found"
}