拆分STDB与HTTP会话token存储槽

This commit is contained in:
2026-04-20 09:32:21 +00:00
parent 9f225684b5
commit 06a8853167
9 changed files with 170 additions and 29 deletions

View File

@@ -10,6 +10,7 @@
- [SPACETIME_DEV_URI_HOTFIX_2026-04-20.md](./SPACETIME_DEV_URI_HOTFIX_2026-04-20.md):修复开发默认配置把 Spacetime 连接误指向 Vite `3000` 端口的问题。
- [SPACETIME_AUTH_TOKEN_FALLBACK_HOTFIX_2026-04-20.md](./SPACETIME_AUTH_TOKEN_FALLBACK_HOTFIX_2026-04-20.md):本地 token 失效时自动降级匿名连接,并提示“登录已过期”的热修记录。
- [STDB_AUTH_TAIL_PHASE1_AUTO_GUEST_CREDENTIAL_REMOVAL_2026-04-20.md](./STDB_AUTH_TAIL_PHASE1_AUTO_GUEST_CREDENTIAL_REMOVAL_2026-04-20.md)Auth 尾巴清理第一段,删除前端自动游客用户名/密码残留。
- [STDB_AUTH_TAIL_PHASE2_TOKEN_SLOT_SPLIT_2026-04-20.md](./STDB_AUTH_TAIL_PHASE2_TOKEN_SLOT_SPLIT_2026-04-20.md):将 STDB token 与旧 HTTP Bearer token 拆成独立存储槽。
- [TASK_AUTO_COMMIT_WORKFLOW_2026-04-20.md](./TASK_AUTO_COMMIT_WORKFLOW_2026-04-20.md):任务完成后按文件边界自动提交的脚本与协作约定。
- [NODE_DEV_STARTUP_HOTFIX_2026-04-20.md](./NODE_DEV_STARTUP_HOTFIX_2026-04-20.md)`npm run dev` 启动失败的热修记录、根因与验证结果。
- [NODE_SERVER_KNOWLEDGE_GRAPH_2026-04-08.md](./NODE_SERVER_KNOWLEDGE_GRAPH_2026-04-08.md):当前 Node 运行时后端的技术栈、入口、鉴权、存储与接口知识图谱。

View File

@@ -0,0 +1,73 @@
# STDB Auth 尾巴清理 Phase 2拆分 STDB Token 与旧 HTTP Bearer 存储槽2026-04-20
## 1. 本轮目标
在不打断现有 `/api/runtime/story/*` 旧链路的前提下,把两种不同语义的 token 从同一个 localStorage key 中拆开:
1. Spacetime 连接 token
2. 旧 Express Bearer access token
## 2. 背景问题
此前前端把这两种 token 混存到同一个 key
- `genarrative.auth.access-token.v1`
这会带来两个直接问题:
1. `AuthGate``authService` 无法区分“当前是在恢复 STDB 会话”还是“当前只是旧 HTTP Bearer 还在”
2. 后续删除 `/api/auth/refresh``/api/runtime/story/*` 时,很容易互相打断
## 3. 本轮落地
### 3.1 新的存储语义
- HTTP Bearer:
- `genarrative.auth.http-access-token.v1`
- Spacetime token:
- `genarrative.auth.spacetime-token.v1`
### 3.2 代码调整
1. `src/services/apiClient.ts`
- 保留旧 HTTP token API
- `getStoredAccessToken`
- `setStoredAccessToken`
- `clearStoredAccessToken`
- 新增 STDB token API
- `getStoredSpacetimeToken`
- `setStoredSpacetimeToken`
- `clearStoredSpacetimeToken`
2. `src/spacetime/client.ts`
- Spacetime 连接改为只读写 STDB token key
3. `src/services/authService.ts`
- 账号恢复链只依据 STDB token 判断是否尝试恢复连接
4. `src/components/auth/AuthGate.tsx`
- UI 启动时只依据 STDB token 判断是否走会话恢复
### 3.3 当前保留不变的旧链路
1. `fetchWithApiAuth()`
2. `/api/auth/refresh`
3. `/api/runtime/story/*` 的旧 Bearer 注入
这些内容仍继续只使用 HTTP token key。
## 4. 当前阶段意义
这一步不是最终删除旧 JWT而是先把 STDB 会话和旧 Express 会话拆成两个独立层:
1. STDB auth 可以继续独立演进
2. runtime story 旧链路暂时还能工作
3. 后续迁 story 到 STDB 时,可以单独移除 HTTP token 相关逻辑
## 5. 验证
已补定向测试覆盖:
1. `src/services/apiClient.test.ts`
- 验证 HTTP token 与 STDB token 独立存储
2. `src/services/authService.test.ts`
- 验证 STDB token 失效回退匿名连接
3. `src/components/auth/AuthGate.test.tsx`
- 验证 UI 恢复链改为读取 STDB token