diff --git a/docs/device-session-management-design.html b/docs/device-session-management-design.html index 15ff059..53a3a62 100644 --- a/docs/device-session-management-design.html +++ b/docs/device-session-management-design.html @@ -90,7 +90,7 @@ ← 文档索引
Pangolin · 「我的设备」管理 + 控制面会话 + 数据面按设备记账 · 2026-06-28
+Pangolin · 「我的设备」管理 + 控制面会话 + 数据面按设备记账 · 2026-06-28 · → 实现计划 P1–P6
devices 表、每设备数据面凭证 dp_uuid、
diff --git a/docs/device-session-management-plan.html b/docs/device-session-management-plan.html
new file mode 100644
index 0000000..6077fb5
--- /dev/null
+++ b/docs/device-session-management-plan.html
@@ -0,0 +1,134 @@
+
+
+
+
+
+阅读版 · 执行真相源(含 checkbox)为 docs/superpowers/plans/2026-06-29-device-session-management.md · 2026-06-29
dialect.Upsert、无 NOW());UI 走 token 单源;不碰 CI-gated golden 的 Linux 基线;每期 build+test 过即 commit。
+devices.Service.RegisterIfAbsent 已完整实现但无人调用;normalizePlatform 拒 linux;DeleteDevice 已调 CredentialRevoker(当前 NoopRevoker,按 user 不按 device)。TokenManager.Issue/Refresh 内部生成 refresh JTI、不外露 → 绑 session 须 surface JTI。auth.Handler 的 login/register 请求体需加 device 字段;clientIP(r) 已有(供 session IP)。auth.NewService(...) 是注入点;nodeSvc.Hub() 将充当 per-device 凭证吊销器。flutter_secure_storage✓ package_info_plus✓,缺 uuid 与 device_info_plus;device_id 现硬编码 'mac-001'。目标:登录/注册成功即写 devices 表 → 「我的设备」显示真实设备。
+uuid + device_info_plus;新 device_identity.dart(生成+持久 device_id、设备名/平台、客户端版本);弃用硬编码 'mac-001'。device:{id,name,platform,client_version}。auth/handler.go 加 device 字段;auth/service.go 成功签发后调 RegisterIfAbsent(注入 DeviceRegistrar 接口,返回 deviceID 供 P2);normalizePlatform 加 linux;main.go 注入。GET /v1/me/devices 非空、含真实设备名/平台目标:会话落库绑设备;列表显示在线/客户端版本/最后登录。
+000016:建 sessions 表;devices 加 client_version+totp_trusted_until;唯一键 UNIQUE(uuid)→UNIQUE(user_id,uuid);platform CHECK 加 linux。server/internal/sessions/ Store(Create/RotateJTI/RevokeByJTI/RevokeByDevice/…)。TokenManager 外露 JTI;auth.Service 注入 sessions:登录 Create、刷新 RotateJTI+last_active、登出 RevokeByJTI。ReportUsage touch devices.last_seen(在线判定);ListDevices 返回 online/last_login/client_version;客户端 Device model 加字段。目标:强制退出(吊销会话留设备)/ 清除(移除+吊销会话+吊销 dp_uuid)。
+POST /v1/me/devices/{uuid}/logout(ForceLogout:RevokeByDevice + 逐 jti Revoke)。DeleteDevice 增强:吊销 session;CredentialRevoker 改 per-device(RevokeDevice(dpUUID),nodes.Hub 实现,main.go 替 NoopRevoker)。account_api.forceLogout + provider。目标:每设备流量真正写库 + 统计页设备下拉真数据。
+ConnectNode 兜底 RegisterIfAbsent;端到端确认 EnsureDeviceDpUUID→per-device dp_uuid→ReportUsage→AccumulateDeviceUsage 填表。deviceUsageProvider(呼应统计整改 #10)。占位:清除登录信息联动 totp_trusted_until(列已在 P2 预留),重登需重做 2FA。待 2FA 主流程就绪后单独排。
目标:按总方案 §7 视觉稿落地「我的设备」交互。
+DevicesScreen 重做:名称/平台·版本/在线绿点/最后登录 + 「本机」标 + 行尾 ⋯ 菜单(强制退出/清除·危险红)+ 危险二次确认弹窗;颜色/字号走 token。go build ./... && go test ./...(含 sqlite 实库)+ ./server/run_sqlite_test.sh;客户端 flutter analyze + flutter test。usage_device_daily 有行。000016 迁移在 pangolin1 跑 pangolin-migrate up —— 生产写操作,执行前单独向用户确认。关联:设备 & 会话管理 总方案 · 统计体系整改(#5)(P4 设备下拉)。
+ +docs/superpowers/plans/2026-06-29-device-session-management.md(含 checkbox)。P1 设备注册打通 → P2 sessions表+在线/最后登录 → P3 强制退出/清除 → P4 每设备流量 → P5 2FA信任(future) → P6 UI重做。