FastApi框架及鉴权机制

发布于:2025-07-11 ⋅ 阅读:(30) ⋅ 点赞:(0)

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的鉴权系统灵活且可扩展,开发者可以根据具体需求选择合适方案或组合多种机制。框架提供的安全工具类简化了常见安全模式的实现,同时保持高度可定制性。


网站公告

今日签到

点亮在社区的每一天
去签到