From e45705c6729d11ee9118a444be8edddceae98ca6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 10 Jun 2026 16:47:27 +0800 Subject: [PATCH] =?UTF-8?q?docs(auth):=20=E9=82=AE=E7=AE=B1=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=AE=9A=E4=B8=BA=E9=95=BF=E6=9C=9F=E4=BF=9D=E7=95=99?= =?UTF-8?q?,OIDC=20=E9=99=8D=E7=BA=A7=E4=B8=BA=E9=80=89=E5=81=9A=20+=20?= =?UTF-8?q?=E6=8B=86=E5=87=BA=20CORS=20=E6=94=B6=E7=B4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 已接入真实用户且邮箱密码长期保留,故: - DESIGN §7.0/§7.3/§7.7 三处「邮箱密码同步下线」改「与 OIDC 并存长期保留」 - 原「真 OIDC 发布前必做」拆成:CORS 收紧(现做)+ OIDC(选做,信任模型可接受则延后) - PROGRESS 下一步候选 #1 同步拆分;auth.py docstring 同步 Co-Authored-By: Claude Opus 4.8 (1M context) --- DESIGN.md | 7 ++++--- PROGRESS.md | 3 ++- web/auth.py | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/DESIGN.md b/DESIGN.md index b87e55d..edaf570 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -193,7 +193,7 @@ SaaS 化不是"重写",而是把同一份 web `/v1` 服务部署到云端。 | working_dir | `workspace/users///` | `/users///` | | Memory | `workspace/users//.memory/` (FS, dotfile) | `/users//.memory/` | | Sandbox | subprocess + env 过滤 | per-user sandbox container + per-tool exec | -| Auth | 邮箱密码(`users.email/password_hash`,bcrypt)→ JWT;platform_key → JWT(机器对机器) | OIDC → JWT(D' 替换 platform_key 路径;邮箱密码同步下线) | +| Auth | 邮箱密码(`users.email/password_hash`,bcrypt)→ JWT;platform_key → JWT(机器对机器) | OIDC → JWT(D' 替换 platform_key 路径);**邮箱密码长期保留**,与 OIDC 并存 | `workspace/` 仅存 skill 产物,state / messages 全在 PG。本地 vs SaaS 共用 `users//` 子树布局,差别只在外层根目录,不在 storage 形态。 @@ -307,7 +307,7 @@ done {} **信任模型**:platform 是单点可信中间层(持 PLATFORM_KEY = 可为任意 user_id 签 token),风险与"platform 服务端泄漏 = 用户身份泄漏"同级,可接受。 -**未来形态(真 OIDC)**:Provider 签 ID token,zcbot `/v1/auth/login` 内部从"校验 PLATFORM_KEY"换成"校验 ID token 签名 + 提取 sub" — **路由层 Depends 不动**,Bearer JWT 契约不变;邮箱密码路径同步下线。所有 storage/executor scoped by `user_id`,**无 tenant 层** — 个人 SaaS 用不上,做企业版再加 `org_id` 等价隔离。 +**未来形态(真 OIDC)**:Provider 签 ID token,zcbot `/v1/auth/login` 内部从"校验 PLATFORM_KEY"换成"校验 ID token 签名 + 提取 sub" — **路由层 Depends 不动**,Bearer JWT 契约不变。**邮箱密码路径长期保留**,与 OIDC 并存(自有账号体系 + 同事试用不依赖外部 IdP);OIDC 只接管 platform 机器对机器那条路径。所有 storage/executor scoped by `user_id`,**无 tenant 层** — 个人 SaaS 用不上,做企业版再加 `org_id` 等价隔离。 ### 7.4 存储:Postgres + 本地文件系统 @@ -447,7 +447,8 @@ create index on usage_events (model_profile, created_at); | B | Storage 落 PG + working_dir 语义 + no-subtask | 一次性切换,无双轨(见下) | | D | HTTP /v1 surface | — | | D' 过渡 | 邮箱密码 + PLATFORM_KEY → JWT + user_id 隔离 + dev SPA | — | -| D' 真 OIDC | 替换 /v1/auth/login 内部为 ID token 校验 + CORS allowlist 收紧 | 1 天,发布前必做 | +| CORS 收紧 | `allow_origins` 从 `*` 改 platform 域名 allowlist | 已接入真实用户,**应尽快做**(与 OIDC 解耦) | +| D' 真 OIDC | 替换 /v1/auth/login 内部为 ID token 校验(邮箱密码并存保留) | 选做,platform_key 信任模型可接受则可延后;真要弃 PLATFORM_KEY 共享密钥时再做 | | C | Executor + sandbox(`run_python`/`shell` → `Executor.run`;docker exec) | 3 天,**外部用户开放的 hard prereq**(详 §7.8 / §7.9 2026-05-21) | | ~~E~~ | ~~CLI transport 双模式~~ | 撤(§7.9) | | ~~G~~ | ~~Web UI 简洁版~~ | 撤(§7.9) | diff --git a/PROGRESS.md b/PROGRESS.md index 7e7e8c4..d030234 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -256,7 +256,8 @@ Python 合计 ~3400 行(+ dev SPA + vendor 1MB);加 skills 脚本 + ## 下一步候选(性价比排序) -1. **真 OIDC 接入 + CORS 收紧**(~1 天)—— `/v1/auth/login` 内部换 OIDC ID token 校验(路由层 Depends 不动);CORS 改 platform 域名 allowlist。**真发布给真实用户前必做**。 +1. **CORS 收紧**(~半小时,已接入真实用户应尽快做)—— `allow_origins` 从 `*` 改读 env 域名 allowlist;与 OIDC 解耦。 + - **真 OIDC**(~1 天,选做)—— `/v1/auth/login` 内部换 ID token 校验(路由层 Depends 不动);**邮箱密码长期保留并存**。platform_key 信任模型可接受则可延后,真要弃 PLATFORM_KEY 共享密钥时再做(延后无技术债)。 2. **§7 C Executor + sandbox 收尾**(~3-5 天,按 §7.5 落地清单)—— 剩 Step 4 完整 egress proxy + Step 3b PGID kill 协议 + xfs project quota OS 层硬化。**Stage C DoD** = 6 条落地清单全完成 + 红队回归通过(metadata IP / PG IP block、残留进程清理、跨 user 网络隔离、egress allowlist)。**多用户在线跑代码 hard prereq**。 3. **Phase 6 context 第二步 task summary**(~1 天)—— 旧消息压成一条 summary(区分硬约束/计划/文件路径/关键事实),不直接塞回旧 tool 原文。 diff --git a/web/auth.py b/web/auth.py index fccfd0b..3a1e74f 100644 --- a/web/auth.py +++ b/web/auth.py @@ -13,8 +13,8 @@ bcrypt + INSERT users;撤用户 `DELETE FROM users WHERE email=...`(messages CASCADE, tasks 通过 FK 拦,要先 DELETE 该 user 的 tasks)。 -OIDC(D')替换:只动 `/v1/auth/login` 实现(校验 ID token 代替 key);password 路径 -真发布时下线。 +OIDC(D')替换:只动 `/v1/auth/login` 实现(校验 ID token 代替 key);**邮箱密码路径 +长期保留,与 OIDC 并存**(自有账号 + 同事试用不依赖外部 IdP)。 """ from __future__ import annotations