Skip to content

波次0-P1 后端卫生:token 契约对真 + core-api 拆分 + 身份行接通(#81) - #85

Merged
HandyWote merged 2 commits into
m1/devfrom
m1/issue-81
Sep 9, 2026
Merged

波次0-P1 后端卫生:token 契约对真 + core-api 拆分 + 身份行接通(#81)#85
HandyWote merged 2 commits into
m1/devfrom
m1/issue-81

Conversation

@HandyWote

Copy link
Copy Markdown
Contributor

波次0-P1 后端卫生(issue #81

只清理不新增功能。按「纯重构 / 行为修复」拆两个 commit,评审可分段核对。

改动

commit 1(纯重构) refactor(core-api): index.ts 按职责域拆分

  • routes/{auth,setup,modules}.ts + middleware/admin.ts(requireAdmin 提为可挂载 Hono 中间件,路径级一挂一域)+ services/{users,instance-config,audit}.ts
  • setup.ts 瘦身为 setup_tokens 表域;MODULE_TOKEN_ISSUER 归 token.ts;getSigningRuntime 归 keys.ts(index 再导出,外部 import 保持兼容)
  • index.ts 只留 Bindings/组装/request-id/health/me;组合根仍导出完整 app
  • 行为零变化:此 commit 下全仓测试 零改动 通过

commit 2(行为修复) fix(core-api): token 契约对真 + 身份行 name + /api/me role + 死账清理

  1. token 契约对真:contracts token.ts 注释改实现语义(aud=模块 id、sub=核心用户 uid、act 从未签发);contracts.test.ts fixture 同步(原 fixture sub:'mod-a'/aud:'core-api' 语义颠倒)
  2. 跨包契约链测试:core-api 签发 → ModuleTokenClaimsSchema.parse → module-sdk verifyModuleToken 一条测试(core-api devDep + @unself/module-sdk
  3. 身份行接通:schema 加 name?: string;签发侧带会话展示名(session.name)→ hello 页 claims.name ?? claims.sub 零改动即得真名
  4. /api/admin/bootstrap-keygen(deploy 自有 keypair.ts,全仓零调用方)
  5. /api/merole(真值来自 users 表);RegistryEntry 删 registeredAt 幻影字段(DB 无此列恒返 '')——apps/shell RegistryModule 类型本无该字段,无需改动
  6. consumeSetupToken 原子化:单条 UPDATE ... WHERE used_at IS NULL + meta.changes 判定;新增并发双激活仅一次成功测试

验收对照表

验收项 结果
三件套 typecheck/test/build 全绿 ✅ 全仓通过(contracts 24 / core-api 77 / shell 43 / module-sdk 39 / deploy 77 / hello 12 / ui 7);旧测试零删减
新增:跨包链路测试 services/core-api/test/cross-package-token.test.ts(签发→schema→verifyModuleToken 全链)
新增:并发双激活仅一次成功 setup.test.ts「并发双激活同一 token:仅一次成功」,真库断言仅一条 setup_activated
grep bootstrap-keygen / registeredAt 零命中 ✅ 全仓源码+测试零命中
身份行走查:hello 页显示真名(agent-browser) 待主会话走查(本地 dev 实例需起依赖栈,本会话未跑浏览器)

测试说明

  • 纯重构 commit 内旧测试零改动通过(C1 提交时全仓测试即绿)
  • 新增测试只断言契约与用户可见行为:HTTP 状态 / 响应形状 / 真库落痕
  • 跨包测试用真 JWKS(/.well-known/jwks.json 响应体)走 module-sdk 本地验签路径

遗留友好提示(不改 docs)

  • services/core-api/src/setup.ts 仍位于 src 根(setup_tokens 域,本次未挪动);后续可考虑与 services/ 目录对齐

- routes/auth.ts:OIDC 登录域(login/callback/logout/test-connection)
- routes/setup.ts:setup 域(setup-token/status/activate)
- routes/modules.ts:模块域(token 签发/注册表/启停/jwks)
- middleware/admin.ts:requireAdmin 提为可挂载 Hono 中间件(路径级一挂一域)
- services/users.ts:users 表域(JIT 建档/展示名/升管理员)
- services/instance-config.ts:instance_config 表域(OIDC 配置/setup_done)
- services/audit.ts:audit_log 表域
- setup.ts 瘦身为 setup_tokens 表域;MODULE_TOKEN_ISSUER 归 token.ts;
  getSigningRuntime 归 keys.ts(index 再导出保持外部 import 兼容)
- index.ts 只留 Bindings/组装/request-id/health/me;组合根仍导出完整 app,
  现有 app.request 集成测试零改动全通过

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
- contracts token.ts:注释改为实现语义(aud=模块 id、sub=核心用户 uid、
  act 从未签发,保留契约字段);新增 name?: string(会话展示名);
  contracts.test.ts fixture 同步(原 sub:'mod-a'/aud:'core-api' 语义颠倒)
- core-api 签发侧带 session.name → hello 页身份行零改动即得真名
  (模块侧 claims.name ?? claims.sub)
- /api/me 响应加 role(真值来自 users 表服务端会话)
- RegistryEntry 删 registeredAt 幻影字段(DB 无此列恒返 '');
  apps/shell RegistryModule 类型本无该字段,无需改动
- consumeSetupToken 原子化:单条 UPDATE ... WHERE used_at IS NULL
  + meta.changes 判定;新增并发双激活仅一次成功测试
- 删 /api/admin/bootstrap-keygen(deploy 自有 keypair.ts,全仓零调用方)
- 新增跨包契约链测试:core-api 签发 → ModuleTokenClaimsSchema.parse
  → module-sdk verifyModuleToken(devDep 加 @unself/module-sdk)

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant