25 分钟
全栈开发

RESTful API 设计与认证

掌握 API 设计原则、JWT 认证和中间件

  • 理解 RESTful API 设计原则
  • 掌握 FastAPI 写 API
  • 理解 JWT 认证流程
  • 了解中间件和 CORS

RESTful API

REST 是一种 API 设计风格:用 URL 表示资源,用 HTTP 方法表示操作。

Python
# 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

Python
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_user
🐍FastAPI 为什么快?

FastAPI 基于 Starlette(ASGI 异步框架)和 Pydantic(数据校验)。它自动生成 OpenAPI 文档(/docs),自动校验请求数据,支持 async/await 异步高并发。在 TechEmpower 基准测试中,FastAPI 性能接近 Go/Node.js。

JWT 认证

JWT(JSON Web Token)是无状态认证方案:用户登录后服务器发一个 token,之后每次请求带上 token,服务器验证签名即可,不需要查数据库。

Python
# 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. 服务器中间件验证签名和过期时间
""")
Python
# 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 设计练习

简单+50 XP

删除 id=5 的用户应该用什么 HTTP 方法和路径?

API 设计练习
1 个测试用例

课后作业

设计博客 API

中等+25 XP

给博客系统做 RESTful API,要覆盖文章 CRUD、评论、点赞、用户注册登录。把所有端点列出来就行。

设计博客 API
1 个测试用例