feat(t230): use OCR for ERP session login
This commit is contained in:
@@ -118,7 +118,8 @@
|
||||
- ERP adapter 只能把版本化 allowlist 归一化对象交给 `FreightSource`;其 HTTP 会话只在
|
||||
Go API 进程内。收件人、电话、
|
||||
地址、完整响应、Cookie、JWT、账号、密码和验证码不得进入领域对象、错误、日志、
|
||||
fixture、SQLite、浏览器或 VLM。验证码必须由人员输入,禁止 OCR、猜测或重放。
|
||||
fixture、SQLite、浏览器或 VLM。T-230 仅允许 API 进程把 ERP 验证码图片一次性发送给
|
||||
受控 `CMROUBAO_OCR_API_URL`;不持久化结果、不重试、不轮询、不暴露人工验证码接口。
|
||||
|
||||
## 7. 安全与隐私
|
||||
|
||||
|
||||
+9
-18
@@ -198,24 +198,11 @@ T-203 成功返回 `201`。使用相同 `Idempotency-Key` 和相同图片内容
|
||||
不得返回 receiver、receiverTel、receiverAddr、Cookie、JWT、ERP 用户资料或完整原始
|
||||
对象。多商品必须全部保留;缺失详情返回协议错误,不允许部分成功。
|
||||
|
||||
### Go ERP 会话(T-226)
|
||||
### Go ERP 会话(T-230)
|
||||
|
||||
以下接口均要求 ADMIN session;所有 `POST` 还要求现有 `X-CSRF-Token` 与 CSRF
|
||||
Cookie。它们只管理单个后端进程内的顺运宝会话,不创建货运同步,也不下发 ERP 账号、
|
||||
密码、Cookie、JWT、完整用户资料或原始响应。
|
||||
|
||||
| 接口 | 说明 |
|
||||
| --- | --- |
|
||||
| `GET /api/v1/erp-session` | 返回 `configured`、`authenticated`、`captcha_ready` 三个布尔状态。 |
|
||||
| `POST /api/v1/erp-session/captcha` | 同一服务端 Cookie jar 获取一次验证码,返回短期 `captcha_ticket` 和仅供当前 ADMIN 读取图片的 `captcha_url`。 |
|
||||
| `GET /api/v1/erp-session/captcha/{ticket}` | 返回 `image/*` 验证码,始终 `Cache-Control: no-store`。ticket 过期或不匹配返回稳定匿名错误。 |
|
||||
| `POST /api/v1/erp-session/login` | 仅接受 `{"captcha_ticket":"...","captcha_code":"..."}`,使用受控本地配置中的账号/密码完成登录和用户校验。 |
|
||||
|
||||
成功状态响应不包含 ticket,验证码接口以外也不会返回验证码图片。稳定错误为
|
||||
`ERP_NOT_CONFIGURED`、`ERP_SESSION_REQUIRED`、`ERP_CAPTCHA_INVALID`、
|
||||
`ERP_LOGIN_REJECTED`、`ERP_RESPONSE_INVALID` 和 `ERP_UNAVAILABLE`;均不包含 ERP
|
||||
正文或凭证。管理员 Web 的等价入口为 `/erp`、`/erp/captcha` 和 `/erp/login`,表单没有
|
||||
账号或密码字段。
|
||||
`/erp`、`/erp/captcha`、`/erp/login` 和 `/api/v1/erp-session*` 不再暴露。创建货运同步
|
||||
前,单一 API 进程在未认证时以同一 Cookie jar 获取验证码、调用受控 OCR、登录并校验用户。
|
||||
验证码图片、OCR 文字、Cookie、JWT、账号、密码和原始响应都不返回浏览器/API,也不写 SQLite。
|
||||
|
||||
ERP 配置来源:
|
||||
|
||||
@@ -226,8 +213,12 @@ ERP 配置来源:
|
||||
- `cmd/api` 只把标准工作目录 `backend-api/.env` 中的上述三个值作为回退。系统环境变量
|
||||
优先;文件缺失不报错。该解析器不修改全局环境,不加载数据库、HTTP、TLS 或 authctl
|
||||
密码,也不支持变量展开、命令执行或任意路径。
|
||||
- `CMROUBAO_OCR_API_URL` 为可选 OCR `POST` endpoint;只允许 HTTPS,或本机 loopback HTTP,
|
||||
不允许 userinfo、query、fragment 或重定向。请求使用 `multipart/form-data` 的 `file` 字段;
|
||||
OCR 不可达、超时、非成功、过大或响应无有效文本时,货运创建返回 `503 OCR_SERVICE_INVALID`
|
||||
且不会创建同步记录。
|
||||
|
||||
会话不写 SQLite、不使用 OCR 或 Redis;服务重启后必须重新人工登录。
|
||||
会话不写 SQLite 或 Redis;服务重启后在下一次货运导入前重新经 OCR 建立会话。
|
||||
|
||||
### `POST /api/v1/freight-syncs`
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
## 当前快照
|
||||
|
||||
- 日期:2026-07-29
|
||||
- 阶段:T-230 待将本机 OCR 接入 ERP 自动登录并移除人工 `/erp` 连接模块
|
||||
- 阶段:T-230 已接入本机 OCR ERP 自动登录并移除人工 `/erp` 连接模块
|
||||
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-219
|
||||
均按文档提交、实现提交的顺序纳入历史
|
||||
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
|
||||
@@ -21,7 +21,8 @@
|
||||
单号/日期查询、分页、详情批量和字段 allowlist,并使货运用例依赖来源中立错误。T-226
|
||||
已增加受锁保护的 Go 内存 Cookie jar、验证码 ticket、登录和用户校验,以及 ADMIN 的
|
||||
`/erp` 页面/API;账号密码可由 `backend-api/.env` 的受控 `CMROUBAO_SHUNYUNBAO_*`
|
||||
回退提供,进程环境变量优先,重启后需人工重新登录。T-227 已将其作为 `FreightSource`,
|
||||
回退提供,进程环境变量优先。T-230 改为导入前由受控 `CMROUBAO_OCR_API_URL` 获取验证码
|
||||
文字并建立内存会话,人工 `/erp` 模块已删除。T-227 已将其作为 `FreightSource`,
|
||||
查询先校验会话、再执行有界分页/详情
|
||||
批量并返回 allowlist;T-228 已删除旧 Python Connector、loopback 端口和共享 API Key;
|
||||
未访问真实 ERP。
|
||||
@@ -187,6 +188,7 @@
|
||||
| `docs/tasks/T-227.md` | DONE | Go 直连顺运宝查询接入货运同步 |
|
||||
| `docs/tasks/T-228.md` | DONE | 移除 Python Connector 并完成 Go 切换 |
|
||||
| `docs/tasks/T-229.md` | DONE | 从受控 `.env` 加载 ERP 凭证 |
|
||||
| `docs/tasks/T-230.md` | DONE | OCR 自动登录并移除人工 ERP 连接页 |
|
||||
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
|
||||
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
|
||||
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
|
||||
@@ -198,11 +200,10 @@
|
||||
## 任务摘要
|
||||
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-219。
|
||||
- 已完成:另含 T-220 至 T-229 ERP 契约、货运存储、采购需求生成、日期增量同步、Go
|
||||
直连协议、人工验证码会话、直连 `FreightSource`、旧 Connector 清理和受控本地凭证加载。
|
||||
- 已完成:另含 T-220 至 T-230 ERP 契约、货运存储、采购需求生成、日期增量同步、Go
|
||||
直连协议、OCR 会话预检、直连 `FreightSource`、旧 Connector 清理和受控本地凭证加载。
|
||||
- 进行中:无。
|
||||
- 下一步:T-230 在按单号导入前受控调用本机 OCR 并建立 ERP 会话;完成后确认开放 API、
|
||||
OCR/ERP 数据使用权限,并以受控单号执行一次不记录订单内容的 smoke。
|
||||
- 下一步:确认开放 API、OCR/ERP 数据使用权限,并以受控单号执行一次不记录订单内容的 smoke。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
|
||||
@@ -37,8 +37,9 @@ T-225 至 T-227 在 `backend-api/internal/platform/shunyunbao` 用脱敏 fixture
|
||||
- 所有结果必须经 Go allowlist 归一化;fixture 专门含收件信息、Cookie/JWT 标记值,
|
||||
测试断言它们不会出现在输出或错误里。
|
||||
|
||||
Go 直连的验证码、登录、Cookie jar 和查询 source 都在 API 进程内。不得用本地 OCR 或
|
||||
Redis 取代人工验证码流程;真实线上请求不属于自动化测试。
|
||||
Go 直连的验证码、登录、Cookie jar 和查询 source 都在 API 进程内。T-230 在未认证时仅可将
|
||||
验证码图片一次提交给受控本机/HTTPS OCR endpoint,结果只用于当前登录请求;不得写入 Redis、
|
||||
SQLite、日志或浏览器,也不得轮询或重试。真实线上请求不属于自动化测试。
|
||||
|
||||
## 身份和规范字段
|
||||
|
||||
|
||||
+1
-3
@@ -14,10 +14,9 @@ T-202 的离线 P0 页面入口见[原型索引](design/index.html)。原型仅
|
||||
| `/freight` | ERP 货运列表 | 查看已导入货运单并进入全部商品明细 | US-011 | IX-012 |
|
||||
| `/freight/import` | ERP 货运导入 | 创建精确单号、最多 7 天日期范围或“同步至现在”任务,并查看成功水位 | US-011 | IX-012 |
|
||||
| `/freight/{id}` | ERP 货运详情 | 查看全部商品明细、来源变化、补图和采购任务生成状态 | US-011、US-012 | IX-012、IX-013 |
|
||||
| `/erp` | ERP 连接 | 查看匿名会话状态、获取验证码并人工输入验证码;不显示或编辑 ERP 凭证 | US-011 | IX-012 |
|
||||
|
||||
MVP 登录后默认进入 `/tasks`。未登录访问受保护页面时跳转 `/login` 并携带安全的
|
||||
站内返回路径;只接受 `/tasks`、`/freight`、`/erp` 及其本站子路径,拒绝绝对 URL、`//`
|
||||
站内返回路径;只接受 `/tasks`、`/freight` 及其本站子路径,拒绝绝对 URL、`//`
|
||||
和反斜杠。
|
||||
不存在和无权限必须使用不同内部原因,但页面均不得泄露任务内容。
|
||||
|
||||
@@ -92,7 +91,6 @@ T-207 的 events/candidates/complete/fail 接受原设备对授权内已产生
|
||||
| `PendingPaymentSummary` | 管理 Web/App | 只读展示对账订单与人工付款提醒,不提供付款或重提动作 |
|
||||
| `FreightSyncForm` | 管理 Web | 创建精确单号/日期同步记录、查看成功水位,不持有 ERP 凭证 |
|
||||
| `FreightItemReview` | 管理 Web | 显示规范化来源字段、缺失项和采购任务生成操作 |
|
||||
| `ERPConnectionPanel` | 管理 Web | 仅展示匿名连接状态、验证码图片和验证码输入,不接收 ERP 账号或密码 |
|
||||
|
||||
具体状态反馈以[交互清单](08-interaction-checklist.md)为准,组件命名可在接入真实框架后
|
||||
调整并同步本文。
|
||||
|
||||
+8
-6
@@ -4,7 +4,7 @@ title: OCR 自动登录顺运宝并移除人工连接页
|
||||
phase: 2
|
||||
deps:
|
||||
- T-229
|
||||
status: TODO
|
||||
status: DONE
|
||||
created: 2026-07-29
|
||||
context_ref: f0fbdba
|
||||
work_branch: null
|
||||
@@ -62,15 +62,15 @@ write_paths:
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [ ] `.env.example` 包含本机 OCR URL,环境变量覆盖 `.env`;无效 URL 不启动,真实 OCR
|
||||
- [x] `.env.example` 包含本机 OCR URL,环境变量覆盖 `.env`;无效 URL 不启动,真实 OCR
|
||||
endpoint 不进入 Git、日志、浏览器或数据库。
|
||||
- [ ] OCR client 的 multipart 字段、超时、重定向拒绝、上限、纯文本/JSON 结果与敏感错误均有
|
||||
- [x] OCR client 的 multipart 字段、超时、重定向拒绝、上限、纯文本/JSON 结果与敏感错误均有
|
||||
fixture 测试。
|
||||
- [ ] 未认证的按单号导入先完成 OCR 登录再创建同步;OCR 失败不创建同步且 Admin 返回可关闭
|
||||
- [x] 未认证的按单号导入先完成 OCR 登录再创建同步;OCR 失败不创建同步且 Admin 返回可关闭
|
||||
`OCR_SERVICE_INVALID` 弹窗并保留表单;已认证会话不重复 OCR。
|
||||
- [ ] `/erp`、人工验证码图片/文本和 ERP connection JSON 路由不再暴露;API 不返回验证码、
|
||||
- [x] `/erp`、人工验证码图片/文本和 ERP connection JSON 路由不再暴露;API 不返回验证码、
|
||||
Cookie、账号、密码或 OCR 原文。
|
||||
- [ ] `go test ./...`、`go test -race ./...`、`go vet ./...` 和 API/migrate/authctl 构建通过。
|
||||
- [x] `go test ./...`、`go test -race ./...`、`go vet ./...` 和 API/migrate/authctl 构建通过。
|
||||
|
||||
## 边界
|
||||
|
||||
@@ -83,3 +83,5 @@ write_paths:
|
||||
|
||||
- 2026-07-29:创建任务;本机发现 `127.0.0.1:8000` 正在监听,但缺少可安全复现的验证码
|
||||
fixture,线上 OCR/ERP 验证留给部署 smoke。
|
||||
- 2026-07-29:实现受控 OCR multipart client、ERP 自动会话预检、导入失败弹窗和公开人工
|
||||
ERP 路由移除;测试与构建命令见实现提交。
|
||||
|
||||
Reference in New Issue
Block a user