1. OAuth2 基础集成 1 2 3 4 5 6 7 8 9 from fastapi import Depends, FastAPIfrom fastapi.security import OAuth2PasswordBearerapp = 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 CryptContextfrom fastapi.security import OAuth2PasswordRequestFormpwd_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 等算法)
典型密码处理流程:
注册时生成哈希密码
登录时验证哈希值匹配性
生成访问令牌返回客户端
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
通过依赖注入实现令牌验证流程
支持多层验证(如检查用户激活状态)
典型验证步骤:
解析 Authorization 请求头
解码 JWT 令牌(需自行实现)
查询数据库验证用户有效性
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. 生产环境最佳实践
HTTPS 强制启用 :通过反向代理配置 TLS/SSL
令牌加密 :使用 HS256 或 RS256 算法签名 JWT
速率限制 :结合 Redis 实现 API 调用频率控制
敏感数据保护 :
密码字段使用 PBKDF2 或 BCrypt 加密
令牌设置合理有效期
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