记录 PC 企微扫码生产验收(07-30-pc-wecom-qr-login)
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s

这个提交包含在:
2026-07-30 18:38:47 +08:00
父节点 eb3ab3455d
当前提交 aea28ed3be
共修改 2 个文件,包含 29 行新增和 19 行删除
@@ -2,8 +2,8 @@
## 1. Preconditions
- [ ] 只读核对企微自建应用已开启“企业微信授权登录”。
- [ ] 只读核对 OA 公网域名已配置为 OAuth 可信域名或 Web 网页授权回调域名,且回调地址仍指向现有 `/api/auth/wecom/callback`。
- [x] 用户在企微后台只读确认自建应用已开启“企业微信授权登录”。
- [x] 用户在企微后台只读确认 OA 公网域名已配置为 Web 授权回调域名;生产配置与托管页契约检查继续使用现有 `/api/auth/wecom/callback`。
- [x] 不在代码、日志、Trellis 或聊天中输出 CorpID、AgentID、Secret、真实 userid、code 或 state。
- [x] 用户批准本 PRD、设计和实施计划后,才运行 `task.py start` 并修改产品代码。
@@ -72,18 +72,18 @@ git diff --check
- [x] 认证改动完成后做只读安全/权限 review,不由 reviewer 修改代码。
- [x] 若实现形成稳定合同,更新 `.trellis/spec/hyb-oa/wecom-boundary.md`。
- [x] 仅在确有操作差异时更新现有管理员手册、部署 checklist/runbook;不新建平行文档。
- [ ] commit 使用中文并引用 `07-30-pc-wecom-qr-login`。
- [x] commit 使用中文并引用 `07-30-pc-wecom-qr-login`。
## 6. Production Gate
- [ ] 企微后台“企业微信授权登录”和回调域名核验取得明确批准并完成。
- [x] 企微后台“企业微信授权登录”和回调域名核验已由用户完成。
- [x] 生产部署已单独获批并完成;未同步或覆盖生产 `.env`,PC 扫码开关保持关闭。
- [ ] 生产配置开启 PC 扫码功能取得另行批准。
- [ ] 真实 PC 扫码或企微桌面端快速登录验收取得另行批准。
- [x] 生产配置开启 PC 扫码功能已单独获批并完成。
- [x] 用户按获批生产验收步骤完成真实 PC 扫码登录。
- [x] 部署后公网 `/ready`、前端构建标识、企微公开配置、密码/邮箱验证码页面入口和工作台入口可用性冒烟通过;本轮未输入凭据或发送验证码。
- [ ] 开启 PC 开关后,由一名已映射 active 员工完成真实 PC 扫码或企微桌面端快速登录,并安全回跳原页面。
- [ ] 确认审计有 `entrySource=pc_qr` 且无敏感字段。
- [ ] 验证关闭 PC 开关后按钮消失、其他登录方式不受影响。
- [x] 开启 PC 开关后,已映射 active 用户完成真实 PC 扫码登录并进入 OA,无需 OA 密码或首次手工绑定。
- [x] 生产只读审计确认最近成功登录为 `entrySource=pc_qr`,且 extra 仅含 `bindingSource` 与 `entrySource`,无敏感键。
- [x] 实际回滚阶段验证开关关闭后 PC 按钮消失,密码、邮箱验证码和工作台入口继续存在;后续已重新成功开启。
## 7. Interrupt and Rollback
@@ -109,4 +109,14 @@ git diff --check
- 公网真实浏览器只读核验确认密码和邮箱验证码标签存在、工作台入口提示存在、PC 扫码按钮数量为 0;未输入凭据或触发验证码。页面仅有既有 favicon 404,不影响登录入口。
- 自动备份三组 timer 和 WARCH3 timer 已刷新到新构建,4 个 timer 均为 enabled/active;发布后自动备份与新鲜度检查通过。
- 运行时依赖审计显示客户端无高危/严重,服务端无严重但仍有 16 个高危告警;本任务没有改动任何依赖或锁文件,该存量风险另行治理,不在认证任务中盲目执行破坏性升级。
- 未执行企微后台设置、生产开关开启或真实扫码;任务保持 `in_progress`。
- 本节记录的关闭态部署阶段尚未执行企微后台核验、生产开关开启或真实扫码;后续开启结果见第 10 节。
## 10. Production Enablement Evidence (2026-07-30)
- 用户只读确认企微自建应用已开启授权登录,回调域名已配置为 OA 公网域名;未修改 Secret。
- 生产开关写入和 server 重建已单独获批。首次命令在 Compose 只读状态查询时因未重复显式注入构建标识而失败,自动回滚后已证明配置、server 和公网均恢复关闭态。
- 第二次使用完整构建标识和实测数据挂载重建 server,但主机无 Node 使外层 JSON 验证循环永远不能通过。中间时点只读检查曾观察到短暂开启,但脚本稍后按设计延迟回滚;用户看到旧入口后,公网复核证明开关已恢复为关闭。
- 第三次改用生产主机已有的 Python 校验 `/ready`,脚本完整退出且明确 PASS。其后在逐步延迟的 3 次公网采样中,开关持续为开启、`pcLoginUrl` 持续存在,构建标识未变。
- 稳定开启后 external deps、runtime smoke 和 4 个 timer 状态通过。直接 PC 入口契约验证确认 302 到企微托管 Web 登录页、`login_type=CorpApp`、state 存在,且关联 cookie 为 HttpOnly/SameSite=Lax;未跟随至企微或消费 code。
- 公网真实浏览器确认“企业微信扫码登录”按钮恰好 1 个,密码和邮箱验证码入口继续存在。
- 用户完成真实 PC 扫码并成功进入 OA。生产只读审计确认最近成功登录为 `entrySource=pc_qr`,时间与本次验收一致,extra 仅含两个允许字段,不含 code、state、nonce、Secret、userid 或原始响应键。
@@ -60,15 +60,15 @@
## Acceptance Criteria
- [ ] 普通 PC 浏览器登录页出现明确的企业微信 Web 登录入口,企业微信内置 WebView 仍走原工作台入口。
- [ ] 已映射 active 员工使用手机企微扫码后进入原请求的安全 OA 页面,无需 OA 密码或首次绑定。
- [ ] 已登录企微桌面端时,可按企微官方组件能力完成快速登录或扫码登录。
- [ ] 未映射、冲突、OA 停用和企微停用账号均失败关闭,页面提示不引导用户先用密码绑定。
- [ ] 登录成功审计可区分 `pc_qr` 与 `wecom_workbench`,且不含 code、state、Secret、完整 userid 或原始 payload。
- [ ] state 篡改、过期、非法入口来源、缺 code、重复使用 code 和恶意 returnTo 的自动化负例通过。
- [ ] PC 扫码回调缺少、篡改或不匹配浏览器关联 cookie 时失败关闭且不调用企微 code 兑换接口;正常浏览器回调后 cookie 被清除,企微一次性 code 回归证明不会创建第二个会话。
- [ ] 现有工作台登录、绑定、onboard、账号密码和邮箱验证码回归通过。
- [ ] 本地后端/前端门禁通过;获得部署批准后,生产配置核验、公网构建标识、真实 PC 扫码和回滚检查通过,之后才通知用户可测试。
- [x] 普通 PC 浏览器登录页出现明确的企业微信 Web 登录入口,企业微信内置 WebView 仍走原工作台入口。
- [x] 已映射 active 用户使用手机企微扫码后进入 OA,无需 OA 密码或首次绑定。
- [x] 企微托管 Web 登录页可按官方能力完成桌面端快速登录或手机扫码;本次已完成真实手机扫码验收。
- [x] 未映射、冲突、OA 停用和企微停用账号均由聚焦负例证明失败关闭,页面提示不引导用户先用密码绑定。
- [x] 生产登录成功审计明确记录 `pc_qr`,且只读检查确认不含 code、state、Secret、完整 userid 或原始 payload 键。
- [x] state 篡改、过期、非法入口来源、缺 code、重复使用 code 和恶意 returnTo 的自动化负例通过。
- [x] PC 扫码回调缺少、篡改或不匹配浏览器关联 cookie 时失败关闭且不调用企微 code 兑换接口;正常浏览器回调后 cookie 被清除,企微一次性 code 回归证明不会创建第二个会话。
- [x] 现有工作台登录、绑定、onboard、账号密码和邮箱验证码回归通过。
- [x] 本地后端/前端门禁、生产配置核验、公网构建标识、真实 PC 扫码、审计抽查和开关回滚检查均通过。
## Test Plan