RESTful API 设计与认证
掌握 API 设计原则、JWT 认证和中间件
- 理解 RESTful API 设计原则
- 掌握 FastAPI 写 API
- 理解 JWT 认证流程
- 了解中间件和 CORS
RESTful API
REST 是一种 API 设计风格:用 URL 表示资源,用 HTTP 方法表示操作。
# RESTful API 设计示例
print("""
GET /api/users → 获取用户列表
GET /api/users/1 → 获取 id=1 的用户
POST /api/users → 创建新用户
PUT /api/users/1 → 更新 id=1 的用户
DELETE /api/users/1 → 删除 id=1 的用户
POST /api/auth/login → 登录,返回 token
GET /api/posts → 获取文章列表
POST /api/posts → 创建文章(需登录)
""")用 FastAPI 写 API
from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel
app = FastAPI()
# 数据模型(自动校验和文档)
class UserCreate(BaseModel):
name: str
email: str
age: int = 0
# 模拟数据库
users_db = [{"id": 1, "name": "小明", "email": "xm@test.com"}]
# 获取用户列表
@app.get("/api/users")
def list_users():
return {"users": users_db}
# 获取单个用户
@app.get("/api/users/{user_id}")
def get_user(user_id: int):
user = next((u for u in users_db if u["id"] == user_id), None)
if not user:
raise HTTPException(404, "用户不存在")
return user
# 创建用户
@app.post("/api/users", status_code=201)
def create_user(user: UserCreate):
new_user = {"id": len(users_db) + 1, **user.dict()}
users_db.append(new_user)
return new_userFastAPI 基于 Starlette(ASGI 异步框架)和 Pydantic(数据校验)。它自动生成 OpenAPI 文档(/docs),自动校验请求数据,支持 async/await 异步高并发。在 TechEmpower 基准测试中,FastAPI 性能接近 Go/Node.js。
JWT 认证
JWT(JSON Web Token)是无状态认证方案:用户登录后服务器发一个 token,之后每次请求带上 token,服务器验证签名即可,不需要查数据库。
# JWT 认证流程
print("""
1. 用户提交用户名密码 → POST /api/auth/login
2. 服务器验证密码,生成 JWT 返回
JWT = header.payload.signature
payload 包含 user_id、过期时间
3. 前端保存 token(localStorage/cookie)
4. 后续请求带 Header:
Authorization: Bearer <token>
5. 服务器中间件验证签名和过期时间
""")# FastAPI JWT 认证(概念演示)
from jose import jwt
from datetime import datetime, timedelta
SECRET = "your-secret-key"
def create_token(user_id: int) -> str:
payload = {
"user_id": user_id,
"exp": datetime.utcnow() + timedelta(hours=24)
}
return jwt.encode(payload, SECRET, algorithm="HS256")
# 依赖注入:需要登录的接口
def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET, algorithms=["HS256"])
return payload["user_id"]
except JWTError:
raise HTTPException(401, "未登录或登录已过期")
@app.get("/api/me")
def my_profile(user_id: int = Depends(get_current_user)):
return {"id": user_id, "name": "小明"}JWT secret 必须足够复杂且保密设置合理过期时间(access token 短期 + refresh token 长期)用 HTTPS 传输密码用 bcrypt/argon2 哈希存储,绝不明文防范 SQL 注入(用 ORM/参数化查询)CORS 不要用 *,指定允许的域名
CORS 跨域
浏览器的同源策略阻止前端从不同域名/端口请求后端。CORS是后端设置的HTTP头,告诉浏览器允许哪些来源访问。
# FastAPI 配置 CORS
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # 前端地址
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)JWT 中哪部分防止被篡改?
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
网络侧:DNS→TCP/TLS→HTTP 请求与响应;浏览器侧:解析 HTML 建 DOM、解析 CSS 建 CSSOM、合并成渲染树,再经过布局(Layout)、绘制(Paint)、合成(Composite)上屏。前端性能优化几乎都围绕这条链路:减小资源体积、优化关键渲染路径、避免频繁触发重排重绘。
挑战任务
API 设计练习
删除 id=5 的用户应该用什么 HTTP 方法和路径?
课后作业
设计博客 API
给博客系统做 RESTful API,要覆盖文章 CRUD、评论、点赞、用户注册登录。把所有端点列出来就行。