08_归档04_VOZEB任务卡
OceanWay 本地 API Key 运行时 R1
Task ID:
OCEANWAY-DEVELOPER-KEYS-R1状态:LOCAL_IMPLEMENTATION_CANDIDATE / NOT_MIGRATED / NOT_DEPLOYEDBase:fc894b1179d6476fb6a4bf612baa93a8ff6782f3
用户结果
已登录用户可以在当前 OceanWay 站点直接创建、查看摘要、明确取回和撤销自己的通用
API Key;整个链路只使用 oceanway_session 与同源 /api/developer/keys,不再要求
Retail Portal Session、Identity Bridge 或旧站运行时。
固定安全契约
- 新 Key 使用
ow_live_前缀和加密随机值;明文只在创建响应或当前所有者明确取回时 返回,不进入普通列表、URL、日志和浏览器持久化存储。 - 数据库分别保存 HMAC-SHA256 与 AES-256-GCM 密文;HMAC Pepper 和 Key 加密密钥 必须彼此独立且保持稳定,不复用会话、模型渠道或迁移 Secret。
- 列表和 Secret 响应均为
private, no-store,Secret 取回额外设置Pragma: no-cache。 - 所有读取、取回和撤销按当前用户 ID 限定。撤销后用户列表不再展示,但服务端保留撤销 时间和摘要,用量历史无需依赖明文 Key。
- 过期或撤销 Key 不得通过服务端认证;用户删除操作不会物理擦除审计所需的最小记录。
- PostgreSQL 是部署运行时;文件 Provider 仅用于本地开发和隔离测试。
本切片内容
- 新增
developer_api_keys表、索引、更新时间触发器和实体级 Repository; - 新增 Key 专用加密/HMAC、文件/PostgreSQL Service 与原始 Key 认证入口;
- 新增
/api/developer/keys、/[keyId]、/[keyId]/secret; /keys切换为 OceanWay developer client,移除 Retail adapter 依赖;- Compose、Render 与 Playwright 环境声明加入两枚独立 Key Secret;
- 自动化覆盖明文不落盘、跨用户隔离、显式取回、撤销失效、缺少安全配置时 fail closed。
明确不包含
- 不连接或读取真实旧 sub2api 数据库;
- 不导入旧 Key,不执行真实用户迁移;
- 不开放 OpenAI 兼容网关路由,不发起真实模型调用;
- 不改余额、套餐、订单或用量事实;
- 不部署、不切换 DNS、不关闭旧服务。
旧 Key 导入必须在后继迁移切片通过代表性合成数据的
audit → dry-run → apply → verify → repeated-apply 后,再获得真实旧库只读授权。导入时
必须把每个有效旧值在同一幂等结果中转换为本表的 HMAC 与密文,并立即验证原值可认证、
可由本人明确取回;失败项进入例外清单,不能标记为成功。
验收命令
pnpm --dir web exec vitest run src/lib/server/developer-api-key-crypto.test.ts src/lib/server/developer-api-key-service.test.ts src/lib/server/database/developer-api-key-repository.test.ts src/app/api/developer/keys/route.test.ts src/app/api/developer/keys/key-actions-route.test.ts src/app/'(user)'/keys/page.test.tsx
pnpm --dir web exec tsc --noEmit
pnpm --dir web run lint
pnpm --dir web run build
git diff --check