FastAPI框架体系介绍
FastAPI是一个现代、高性能的Python Web框架,专为构建API而设计。它基于Starlette和Pydantic库,提供了自动生成OpenAPI文档和JSON Schema的功能。FastAPI支持异步请求处理,性能接近NodeJS和Go。主要特点包括:
- 类型安全:通过Python类型提示实现数据验证和自动转换
- 自动文档生成:内置Swagger UI和ReDoc支持
- 依赖注入系统:简化组件管理和重用
- 标准化兼容:完全支持OpenAPI和JSON Schema
框架核心组件包括路由系统、请求/响应模型、依赖注入、后台任务、WebSocket支持等。典型应用场景包括微服务、机器学习API、物联网后端等。
FastAPI鉴权机制实现
FastAPI提供多种方式实现API鉴权,以下是常见方案:
OAuth2密码授权流程
使用OAuth2密码流程需要安装额外依赖:
pip install python-multipart
from fastapi import Depends, FastAPI, HTTPException
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
# 验证用户名密码逻辑
return {"access_token": "fake_token", "token_type": "bearer"}
@app.get("/items/")
async def read_items(token: str = Depends(oauth2_scheme)):
return {"token": token}
JWT令牌验证
JSON Web Token是常见方案,需要安装PyJWT:
pip install pyjwt
from datetime import datetime, timedelta
import jwt
from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBearer
security = HTTPBearer()
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
def create_access_token(data: dict, expires_delta: timedelta = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
async def get_current_user(token: str = Depends(security)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
return payload
except jwt.PyJWTError:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
)
API密钥验证
对于简单场景可以使用API密钥:
from fastapi import Security, Depends
from fastapi.security import APIKeyHeader
api_key_header = APIKeyHeader(name="X-API-Key")
async def get_api_key(api_key: str = Security(api_key_header)):
if api_key != "valid-key":
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid API Key",
)
return api_key
@app.get("/protected/")
async def protected_route(key: str = Depends(get_api_key)):
return {"message": "Access granted"}
最佳实践建议
- 生产环境使用HTTPS加密所有通信
- JWT令牌设置合理有效期并使用刷新令牌机制
- 敏感数据不应存储在JWT中
- 定期轮换加密密钥
- 实现速率限制防止暴力破解
- 使用权限系统进行细粒度访问控制
FastAPI的鉴权系统灵活且可扩展,开发者可以根据具体需求选择合适方案或组合多种机制。框架提供的安全工具类简化了常见安全模式的实现,同时保持高度可定制性。