账户系统完善,使用uuid+多identity记录

This commit is contained in:
2026-04-20 03:28:03 +00:00
parent d06b3ad38c
commit d2a059d57a
26 changed files with 832 additions and 431 deletions

View File

@@ -36,6 +36,32 @@
- 有 JWT 时使用 SpacetimeDB 自带 `sender_auth().jwt()` 建档,`login_provider` 标记为 `jwt`
- 用户主键按 `user_<identity_hex>` 生成,避免再依赖原先 Node 自签 access token / refresh token 流程
### 2.2 内部账户模型状态
当前 STDB 私有实现已经开始显式转向账户语义:
- 私有 Rust struct 已经切到 `Account / AccountIdentity / AccountSession`
- `auth.rs / runtime.rs / lib.rs` 内部 helper 和生命周期接线也开始改用 `account` 语义命名
- 公开 view / procedure 名称暂时保持不变,但当前 schema 字段已经切到 `account_id / owner_account_id`
- 前端 TypeScript bindings 已经重新生成并同步适配了 `account_id` 语义
### 2.1 当前统一账户策略
当前已经开始按“统一账户,多设备会话”方向调整:
- 新建账户时,账户主键已经不再直接使用连接 identity而是生成独立 `acct_*` 账户 id
- 当前设备在短信验证时,如果手机号已命中已有用户,不再直接报“手机号已绑定其他账号”
- 当前连接的 identity / session 会被归并到这个已有手机号用户
- 当前游客账户下的快照、设置、自定义世界、游玩统计、浏览历史等运行时数据也会一起迁移到目标账户
- 这样同一个手机号可以在多个设备上同时建立会话,并归到同一个用户主体下
当前限制:
- 归并的是“当前连接身份”和“当前会话”
- 当前的账户数据迁移是规则式合并,不是全量业务语义级合并
- 例如看板/游玩统计用了保守合并策略,自定义世界同名冲突按更新时间取新
- 也就是说,统一账户主语义已经开始生效,但后续仍值得补一轮更细的并档策略
### 3. 短信验证门禁
当前行为已经按你的要求落地:
@@ -62,7 +88,7 @@
- `client_app_config`
- `my_auth_state`
- `my_auth_audit_logs`
- `my_user_sessions`
- `my_account_sessions`
- `my_auth_risk_blocks`
- `my_snapshot`
- `my_runtime_settings`
@@ -85,7 +111,7 @@
为了承接客户端账户弹窗,本轮补了:
- `my_user_sessions`
- `my_account_sessions`
- 用于读取当前账号关联的会话列表
- `my_auth_risk_blocks`
- 用于读取当前账号手机号/IP 对应的保护记录
@@ -153,7 +179,7 @@ spacetime sql genarrative-local "$(tr '\n' ' ' < scripts/spacetime/init_local_ap
- `src/services/storageService.ts`
- 已从 `/api/runtime/*` 的存档/设置/资料库接口切到 Spacetime。
- `src/services/authService.ts`
- 现在也会读取 `my_user_sessions` / `my_auth_risk_blocks`,并调用 `lift_my_risk_block`
- 现在也会读取 `my_account_sessions` / `my_auth_risk_blocks`,并调用 `lift_my_risk_block`
- `src/components/auth/AuthGate.tsx`
- 已改成默认游客建连,并监听 `verification_prompt_event` / `kick_event`
- `src/components/auth/PhoneVerificationModal.tsx`