0%

FastAPI自学教程(35) - 安全性机制

1. OAuth2 基础集成

1
2
3
4
5
6
7
8
9
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@app.get("/items/")
async def read_items(token: str = Depends(oauth2_scheme)):
return {"token": token}
  • 使用 OAuth2PasswordBearer 声明基于密码流的 OAuth2 认证方案
  • tokenUrl="token" 指定客户端获取令牌的端点路径
  • 自动在 Swagger UI 生成 Authorize 按钮和身份验证表单

流程图:

graph TD
    A[客户端请求] --> B{Header包含Bearer Token?}
    B -->|是| C[验证令牌有效性]
    B -->|否| D[返回401 Unauthorized]
    C --> E{验证通过?}
    E -->|是| F[执行路径操作]
    E -->|否| G[返回403 Forbidden]

2. 密码哈希与表单验证

1
2
3
4
5
6
7
8
9
10
11
from passlib.context import CryptContext
from fastapi.security import OAuth2PasswordRequestForm

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(fake_db, form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=400, detail="认证失败")
return {"access_token": user.username, "token_type": "bearer"}
  • 使用 OAuth2PasswordRequestForm 处理登录表单数据
  • CryptContext 提供密码哈希与验证功能(支持 bcrypt、pbkdf2 等算法)
  • 典型密码处理流程:
    1. 注册时生成哈希密码
    2. 登录时验证哈希值匹配性
    3. 生成访问令牌返回客户端

3. 令牌验证与用户获取

1
2
3
4
5
6
7
8
9
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
if not user:
raise HTTPException(status_code=401, detail="无效令牌")
return user

@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
  • 通过依赖注入实现令牌验证流程
  • 支持多层验证(如检查用户激活状态)
  • 典型验证步骤:
    1. 解析 Authorization 请求头
    2. 解码 JWT 令牌(需自行实现)
    3. 查询数据库验证用户有效性

4. OpenAPI 集成特性

1
2
3
4
5
6
7
8
9
10
11
security_schemes = {
"Bearer": {
"type": "oauth2",
"flows": {
"password": {
"tokenUrl": "token",
"scopes": {"read": "读取权限", "write": "写入权限"}
}
}
}
}
  • 自动生成交互式文档的安全配置
  • 支持的安全方案类型:
    • API Key(查询参数/请求头/cookie)
    • HTTP Basic/Digest
    • OAuth2(密码流/隐式流等)
  • 文档展示令牌作用域和权限说明

5. 生产环境最佳实践

  1. HTTPS 强制启用:通过反向代理配置 TLS/SSL
  2. 令牌加密:使用 HS256 或 RS256 算法签名 JWT
  3. 速率限制:结合 Redis 实现 API 调用频率控制
  4. 敏感数据保护
    • 密码字段使用 PBKDF2 或 BCrypt 加密
    • 令牌设置合理有效期
  5. CORS 配置:严格限制跨域访问来源

测试命令示例:

1
2
3
4
5
# 获取访问令牌
curl -X POST -d "username=admin&password=secret" http://localhost:8000/token

# 访问受保护端点
curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:8000/users/me