配置 OpenAPI¶
使用设置与环境变量基于环境实现按条件配置 OpenAPI,甚至完全禁用 OpenAPI。
关于安全、API 与文档¶
在生产环境下隐藏文档用户界面并不能妥善保护 API。
这种方式不会让 API 更安全,而且路径操作依然有效。
如果代码中存在安全隐患,这些隐患仍然存在。
隐藏文档只是让与 API 的交互变得更难,也让在生产环境下的调试变得更难。这种方式只是隐式安全(Security through obscurity)的简单形式。
以下几种方式能更好地保证 API 的安全:
- 确保要好好定义请求体与响应的 Pydantic 模型
- 使用依赖项配置所需的权限与角色
- 永远不要保存明文密码,只保存哈希过的密码
- 使用知名的加密工具,如 Passlib 或 JWT Token 等
- 在必要时,使用 OAuth2 作用域添加更多精细权限控制
- 等……
尽管如此,您还可能会遇到极个别的用例,要在某些环境(如生产环境)下禁用 API 文档,或根据环境变量配置 OpenAPI。
使用设置与环境变量按条件配置 OpenAPI¶
使用 Pydantic 设置可以轻松地配置 OpenAPI 与 API 文档。
例如:
from fastapi import FastAPI
from pydantic 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_URL
设置为空字符串,就可以禁用 OpenAPI(包括 API 文档),如下所示:
$ 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"
}