xPdf Label API - 后台认证机制
本文档描述三个接口的认证策略差异及 V3 优化缓存机制。
接口认证策略对比
| 接口 | 认证方式 | 请求头 | 适用场景 |
|---|---|---|---|
/api/v1/label | Internal Token (S2S) | 无需 (使用环境变量 XADMIN_TOKEN) | 系统间内部调用 |
/api/v2/label | 无认证 | 无需 | 测试/开发环境 |
/api/v3/label | Bearer Token (User) | Authorization: Bearer <user_token> | 面向终端用户 |
V1: 内部服务认证 (S2S)
流程:
- 服务端使用环境变量
XADMIN_TOKEN(系统级 Token) - 同步调用 xAdmin
/v1/verify验证 - 验证通过后生成 PDF
配置:
- 环境变量
XADMIN_TOKEN: 系统级 API Token - 环境变量
SKIP_XADMIN_VERIFY: 设置后跳过验证 (开发用)
V2: 无认证
直接处理请求,不进行任何用户验证。仅用于测试和内部开发。
V3: 用户 Token + 优化缓存
请求头要求
http
Authorization: Bearer <user_token>核心架构
┌─────────────────────────────────────────────────────────────┐
│ V3 认证流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 请求 ──► 提取 Token ──► 本地缓存检查 │
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ [缓存命中且有效] [缓存未命中/过期/黑名单] │
│ │ │ │
│ ▼ ▼ │
│ 异步验证 (tokio::spawn) 同步验证 xAdmin │
│ │ │ │
│ ▼ ├──►失败──► 403 │
│ 直接通过 │ │
│ │ ▼ │
│ │ 更新缓存 │
│ └───────────────┬───────────────┘ │
│ ▼ │
│ 生成 PDF ──► 200 OK │
│ │
└─────────────────────────────────────────────────────────────┘缓存机制详情
缓存结构 (内存 DashMap):
rust
struct UserCacheEntry {
expires_at: Instant, // 过期时间 (5分钟)
blacklisted: bool, // 是否在黑名单
}缓存策略:
| 场景 | 处理方式 | 响应延迟 |
|---|---|---|
| 缓存命中且有效 | 异步后台验证,立即通过 | < 1ms |
| 缓存未命中 | 同步调用 xAdmin 验证 | 50-200ms |
| 缓存过期 | 同步调用 xAdmin 验证 | 50-200ms |
| 黑名单用户 | 同步调用 xAdmin 验证 | 50-200ms |
| 验证失败 | 标记黑名单,返回 403 | - |
黑名单机制
- 触发条件: xAdmin 返回验证失败 (余额不足/Token 无效)
- 作用: 强制后续请求走同步验证
- 过期时间: 5 分钟 (与正常缓存相同)
- 解除条件: 过期后重新同步验证通过
异步验证流程
当缓存有效时:
- 主流程立即返回"认证通过"
tokio::spawn启动后台任务- 后台任务调用 xAdmin 验证/上报使用量
- 若验证失败,标记用户至黑名单
xAdmin 验证接口
请求:
http
POST https://api-xadmin.mawb.com/v1/verify
Authorization: Bearer <token>
Content-Type: application/json
{ "count": 5 }响应:
200 OK: 验证通过401 Unauthorized: Token 无效402 Payment Required: 余额不足403 Forbidden: 账户被禁用
架构差异: Server vs Worker
| 组件 | 认证实现 | 缓存存储 | 异步机制 |
|---|---|---|---|
| xpdf-server | 内存 DashMap | 进程内存 | tokio::spawn |
| xpdf-worker | Durable Object (AuthDO) | DO 状态 | ctx.waitUntil() |
Worker (Cloudflare) 特殊机制
- AuthDO: Durable Object 实现状态持久化
- Service Binding: 零延迟内部 RPC 调用 xAdmin
- Alarm: 定时同步余额和使用量
- Fail-Open: xAdmin 不可用时默认允许请求
环境变量配置
| 变量 | 作用 | 默认值 |
|---|---|---|
XADMIN_TOKEN | V1 系统级 Token | cbc637dca6dc48ae83636ff75ef48575 |
SKIP_XADMIN_VERIFY | 设置后跳过所有验证 | 未设置 |
性能对比
| 特性 | V1 (同步) | V3 (缓存) |
|---|---|---|
| 首次请求延迟 | 100-300ms | 100-300ms |
| 后续请求延迟 | 100-300ms | < 5ms |
| xAdmin 压力 | 高 (每次请求) | 低 (仅缓存未命中) |
| xAdmin 宕机影响 | 服务不可用 | 5分钟内可用 |
错误响应
| HTTP 状态码 | 触发条件 | 响应体 |
|---|---|---|
401 Unauthorized | Authorization 头缺失或格式错误 | "Missing Authorization header" |
403 Forbidden | xAdmin 验证失败 | "Authentication Failed or Quota Exceeded" |
500 Internal Server Error | xAdmin 服务不可用 (V1) | "Authentication Service Unavailable" |
📌 文档版本: 2026-01-04
📌 源文件:api.rs,optimized_v3_auth_design.md,endpoint_v3_auth_flow.md