Product Accounts and Personalization - jiale-li-orion/SecFusionAgent GitHub Wiki
产品账户、会话与个性化
当前实现:2026-10-16 main;早期本机联调与本轮回归分开记账,见 验收台账。本文补充 PRD、TD2/TD2A 和 Product SPEC;账户需求来自用户追加的注册、登录态与会话绑定要求。
账户与身份
前端 /auth?mode=login|register&returnTo=... 提供注册、登录和安全站内回跳;页眉提供账户菜单与退出。邮箱唯一且规范化为小写;名称 1–80 字符;新密码 12–128 字符。密码使用带独立随机盐的 scrypt 哈希。随机会话令牌只进入 HttpOnly/SameSite=Lax Cookie,数据库仅保存令牌哈希和有效期,默认 7 天。生产环境 Cookie 为 Secure,入口使用 HTTPS。
| API | 语义 |
|---|---|
POST /api/v1/auth/register |
创建账户、签发会话,201 |
POST /api/v1/auth/login |
验证密码、轮换当前会话 |
GET /api/v1/auth/me |
读取当前账户;匿名返回 authenticated=false |
POST /api/v1/auth/logout |
持久撤销会话、清 Cookie |
PUT /api/v1/auth/profile |
更新当前账户显示名称,保留身份与会话;要求 Origin/CSRF |
GET /api/v1/questions/sessions?limit=20&cursor=... |
当前账户最近会话;返回 has_more 与 next_cursor 继续读取更早会话 |
GET /api/v1/questions/sessions/{session_id}?limit=50&before_turn=... |
当前账户的会话回合;返回 has_more 与 next_before_turn 继续读取更早回合 |
业务身份从 Cookie 对应的账户产生 user:{id},不再采信 X-Principal。注册、登录、退出以及已登录业务写操作要求 X-SecFusion-CSRF: 1,检查 Origin 和 Sec-Fetch-Site;校验错误不回显请求输入。账户及 Product API 使用 no-store。数据库迁移为 0031(承接 0030 偏好与推荐反馈)。
私有与共享边界
WORLD、共享来源证据、canonical Knowledge 和聚合健康可匿名浏览。提问、调查、个人偏好、推荐反馈、按需富化与任务运行明细需要账户。Case 的持久控制 TaskContract、会话 principal 和会话回合到 Decision 的引用是权限依据。详情、列表、Activity、SSE、模型请求统计和 A2A 不能绕过所有权。system 任务如果 on_behalf_of 指向另一个账户,也属于私有任务。公共 Skill/Experience 限定明确平台种子或完全由系统来源支撑的记录。来源链接可由已登录账户只读打开纯系统 Case:控制者须为 system,且任何关联任务均不得含 user principal/on_behalf_of;不授予取消或续写权,不加入个人调查列表。
原 user:local 历史数据保留,不自动转移给首个注册账户。登录不会改变公共证据和知识的权威归属。账户切换会清理前端查询及 mutation 缓存、重建页面状态;BroadcastChannel 通知其他标签重新读取身份,窗口重新聚焦也强制检查登录态;迟到的旧请求不影响新登录。退出或过期后的 SSE 关闭。
资料与工作空间
/workspace 汇总当前账户的会话、调查、关注和运行工作台入口。/workspace/profile 可编辑 1–80 字符显示名称,并管理最多 20 个关键词与 20 个关注对象;保存后推荐读取失效并重新加载。资料修改是幂等的值替换,账户由 Cookie 解析,不能用请求体或 X-Principal 选择其他账户。名称写入后 /auth/me 读取同一持久值,不涉及邮箱更改或会话轮换。
问答历史通过抽屉访问;调查与运行的既有深链接保留。顶层导航及视觉规范以 本轮体验规范 为准。
用户闭环
注册 → 保存关键词/关注对象 → 查看解释性推荐及来源 → 感兴趣/忽略/撤销反馈 → 提问或调查 → 最近会话继续 → 退出 → 登录后恢复。推荐基于明确输入、当前 accepted 且有证据的 canonical 对象及关系;不声称训练个性化模型。
START 恢复真实 session/turn/target/decision/case。新会话清除旧结果坐标。富化提交真实 EnrichmentRole task,带幂等键和选定维度,页面跟踪终态并更新档案;missing、unknown、conflict 不被装饰性完成度替代。
会话列表与回合历史使用服务端所有权校验的游标分页。前端按需加载更早的会话和回合,直达旧回合的链接会继续取页直到找到目标回合;分页不改变 Decision、Case 和 Evidence 的权威归属。
AGENTS 的近期拓扑保留有限运行窗口,旁边的历史列通过 GET /api/v1/tasks?limit=24&cursor=... 逐页读取同一账户可见的旧 Task。页序按 updated_at 和 run_id 稳定排序,游标返回 has_more 与 next_cursor;单个 Task 详情仍独立校验所有权。INTELLIGENCE 活动流按 next_cursor 分页,不再使用旧推荐首屏六条/总上限 24 条的交互;每条推荐理由可直达对应 Evidence。旧 /recommendations 接口保留兼容语义。打开 Incident 档案时不再同时渲染首页目录与个人推荐区。
部署与验收
SECFUSION_AUTH_ALLOWED_ORIGINS 为精确 Origin 的 JSON 数组;本机代理已配置 127.0.0.1/localhost 的 5173、4173,生产反向代理应配置外部 HTTPS Origin。SECFUSION_AUTH_SESSION_TTL_SECONDS 默认 604800。沿用现有 Basic Auth 边界时,它是外围访问保护,不能代替应用账户。
2026-10-08 历史浏览器验收验证注册、HttpOnly Cookie、保存偏好与刷新、真实调查/会话绑定、退出拒绝访问、重新登录恢复、两个账户与伪造 X-Principal 隔离。当时六入口桌面/手机无横向溢出及 pageerror,账户页中英文 320/390/760/800/1024/1440 宽度通过。账户、跨账户授权及既有 Product 接口使用最小相关回归;没有为账户引入认证绕过。
邮箱验证、邮件找回密码和 OAuth 没有实现,不计入本轮注册/登录交付。文档不将本机联调等同于完整公网生产发布或决赛质量分数。
2026-10-12 关注身份与动态流
GET /api/v1/intelligence/follow-resolution?q=... 依据对象名称、规范身份和外部标识返回唯一精确匹配或候选列表;同名对象需要选择,找不到对象时可明确保存为主题。关注对象保存在既有 preferences 中,资料页与情报页展示可打开档案、可取消关注的持久关注列表。仓库、产品和包是关注身份,不直接作为动态卡片。
新增 GET /api/v1/intelligence/feed,mode=following|recommended 由服务端分别生成关注时间流和安全优先推荐流。匹配仅使用标题/正文的显式主题或自身留证关系;不扫描整个 properties JSON。普通 PR/提交不进入动态;安全 PR/提交必须同时具有安全内容和连接漏洞/安全事件等对象的已接受、已留证安全关系。Release 需要安全内容或明确重大/不兼容变化。默认 window=30d,可以显式选择 all 包含更早材料;动态时间来自当前有意义内容或安全关系的首次支持证据,优先取来源更新时间、发布时间,缺失时取发现时间;原始发布时间与动态更新时间分别保留。
分页通过稳定排序与 next_cursor 延续;游标携带观察截止时间和 Knowledge revision,取消原 24 条显示上限。该视图仍组合当前 Knowledge,而非历史 Knowledge 重放保证。完整有意义标题/正文及规范安全关系形成稳定 activity ID,采集次数和 metadata 更新不会产生新条目;内容重复时合并来源引用。只有标题时保留对象身份参与去重,避免把不同对象的同名标题合并。标题、摘要、时间继续保留各自 provenance。
PUT /api/v1/intelligence/feed/{activity_id}/feedback 保存单条动态的 interested/ignored/neutral,迁移 0035 增加 principal + activity ID 主键的独立表。忽略不会修改对象关注,也不会覆盖原 /recommendations/{object_id}/feedback 数据;旧推荐 API 保留兼容语义,既有对象级忽略仍过滤新动态流。当前动态不增加模型调用,eligibility/ranking 由 packages.intelligence.feed 持有。空结果保留空态,不用资料库对象补满推荐列表。