本文引用的文件
本文件面向AI有声书生成平台的认证中间件,系统性阐述JWT令牌验证机制的实现原理与使用方式,覆盖以下关键主题:
认证中间件位于后端服务的中间件层,与路由控制器、服务层、配置与类型定义紧密协作。下图展示了认证相关模块在整体架构中的位置。
graph TB
subgraph "应用入口"
APP["Koa 应用<br/>server/src/app.ts"]
end
subgraph "中间件层"
ERR["错误处理中间件<br/>server/src/middleware/errorHandler.ts"]
SEC["安全中间件<br/>security.ts"]
PERF["性能监控中间件<br/>performance.ts"]
AUTH["认证中间件<br/>server/src/middleware/auth.ts"]
USAGE["用量限制中间件<br/>server/src/middleware/usageLimit.ts"]
end
subgraph "业务模块"
AUTH_CTRL["认证控制器<br/>server/src/modules/auth/auth.controller.ts"]
AUTH_SVC["认证服务<br/>server/src/modules/auth/auth.service.ts"]
end
subgraph "配置与类型"
CFG["配置中心<br/>server/src/config/index.ts"]
TYPES["类型定义<br/>server/src/types/index.ts"]
end
APP --> ERR
APP --> SEC
APP --> PERF
APP --> AUTH
APP --> USAGE
AUTH_CTRL --> AUTH
AUTH_SVC --> AUTH
AUTH --> CFG
AUTH --> TYPES
AUTH_CTRL --> TYPES
AUTH_SVC --> TYPES
图表来源
章节来源
章节来源
下图展示了从HTTP请求到控制器执行的完整链路,重点标注了认证中间件的位置与职责。
sequenceDiagram
participant C as "客户端"
participant A as "Koa 应用<br/>server/src/app.ts"
participant M as "认证中间件<br/>server/src/middleware/auth.ts"
participant U as "用量限制中间件<br/>server/src/middleware/usageLimit.ts"
participant CTRL as "认证控制器<br/>server/src/modules/auth/auth.controller.ts"
C->>A : "HTTP 请求"
A->>M : "进入强制认证中间件"
alt "开发模式且AUTH_ENABLED=false"
M->>M : "注入测试用户信息"
else "生产模式或AUTH_ENABLED=true"
M->>M : "校验Authorization头格式"
M->>M : "验证JWT签名"
alt "签名有效"
M->>M : "将用户信息写入ctx.state.user"
else "签名无效/过期"
M-->>C : "返回401未授权"
A-->>C : "经错误处理中间件格式化"
exit
end
end
M->>U : "进入用量限制中间件"
U->>U : "读取ctx.state.user并校验配额"
U->>CTRL : "进入受保护的控制器方法"
CTRL-->>C : "返回业务响应"
图表来源
payload提取与用户信息注入
验证通过后,将JwtPayload写入ctx.state.user,供后续中间件与控制器使用。
flowchart TD
START(["进入认证中间件"]) --> CHECK_DEV["检查开发模式开关"]
CHECK_DEV --> |开发模式且未开启认证| SKIP["注入测试用户信息"] --> NEXT1["继续执行下游中间件/控制器"]
CHECK_DEV --> |生产模式或明确开启认证| HEADER["读取Authorization头"]
HEADER --> FORMAT{"格式为 Bearer <token>?"}
FORMAT --> |否| ERR1["抛出未授权错误:缺少/格式错误"] --> END
FORMAT --> |是| VERIFY["使用密钥验证JWT签名"]
VERIFY --> VALID{"验证结果"}
VALID --> |失败| ERR2["抛出未授权错误:过期/无效"] --> END
VALID --> |成功| SAVE["将用户信息写入ctx.state.user"] --> NEXT2["继续执行下游中间件/控制器"]
NEXT1 --> END(["结束"])
NEXT2 --> END
图表来源
章节来源
可选认证(optionalAuth)
适合前端联调、公开接口或需要匿名体验的场景。
flowchart TD
A_START(["进入可选认证"]) --> HAS_HDR{"是否存在Authorization头?"}
HAS_HDR --> |否| TEST_USER1["注入测试用户信息"] --> A_NEXT["继续执行下游中间件/控制器"]
HAS_HDR --> |是| SPLIT["拆分'Bearer <token>'"]
SPLIT --> IS_BEARER{"前缀为Bearer且仅两段?"}
IS_BEARER --> |否| TEST_USER2["注入测试用户信息"] --> A_NEXT
IS_BEARER --> |是| VERIFY_OPT["验证JWT签名"]
VERIFY_OPT --> VERIFY_RES{"验证结果"}
VERIFY_RES --> |成功| SAVE_OPT["将用户信息写入ctx.state.user"] --> A_NEXT
VERIFY_RES --> |失败| TEST_USER3["注入测试用户信息"] --> A_NEXT
图表来源
章节来源
章节来源
token生成方法
生成后由登录接口返回给客户端。
sequenceDiagram
participant CLI as "客户端"
participant SVC as "认证服务<br/>server/src/modules/auth/auth.service.ts"
participant CFG as "配置中心<br/>server/src/config/index.ts"
CLI->>SVC : "发起手机号登录/注册"
SVC->>CFG : "读取JWT密钥与过期时间"
SVC->>SVC : "生成payload并签名"
SVC-->>CLI : "返回token与用户信息"
图表来源
章节来源
章节来源
更新用户信息接口:同样使用强制认证中间件,结合数据库模型进行更新。
sequenceDiagram
participant C as "客户端"
participant R as "路由/控制器<br/>server/src/modules/auth/auth.controller.ts"
participant M as "认证中间件<br/>server/src/middleware/auth.ts"
participant S as "认证服务<br/>server/src/modules/auth/auth.service.ts"
C->>R : "GET /api/auth/user-info"
R->>M : "进入强制认证中间件"
M-->>R : "ctx.state.user可用"
R->>S : "根据userId查询用户信息"
S-->>R : "返回用户详情"
R-->>C : "返回业务响应"
图表来源
章节来源
章节来源
章节来源
章节来源
与限流中间件:可选地在认证后基于用户ID进行精细化限流(例如TTS生成限流)。
graph LR
AUTH["认证中间件"] --> USAGE["用量限制中间件"]
AUTH --> RATE["限流中间件"]
AUTH --> CTRL["业务控制器"]
ERR["错误处理中间件"] --> AUTH
ERR --> USAGE
ERR --> RATE
图表来源
章节来源
与其他中间件耦合
限流中间件可基于ctx.state.user进行用户级限流。
graph TB
AUTH_TS["认证中间件(auth.ts)"]
CFG_TS["配置中心(index.ts)"]
TYPES_TS["类型定义(index.ts)"]
ERR_TS["错误处理中间件(errorHandler.ts)"]
AUTH_CTRL_TS["认证控制器(auth.controller.ts)"]
AUTH_SVC_TS["认证服务(auth.service.ts)"]
USAGE_TS["用量限制中间件(usageLimit.ts)"]
AUTH_TS --> CFG_TS
AUTH_TS --> TYPES_TS
AUTH_TS --> ERR_TS
AUTH_CTRL_TS --> AUTH_TS
AUTH_CTRL_TS --> AUTH_SVC_TS
USAGE_TS --> AUTH_TS
图表来源
章节来源
章节来源
本认证中间件以最小侵入的方式实现了JWT认证,兼顾开发效率与生产安全。通过强制认证与可选认证两种模式,满足不同场景需求;配合统一错误处理与类型定义,保证了请求链路的稳定性与可维护性。建议在生产环境中始终开启严格认证,并结合用量限制与限流策略,进一步提升系统的安全性与可靠性。
章节来源
章节来源