Page:
T-226
Pages
00-ai-start-here
01-vision
02-requirements
03-tech-stack
04-architecture
05-coding-rules
06-tasks
07-user-stories
08-interaction-checklist
Design
Home
Integrations-shunyunbao-contract
PPT
T-001
T-002
T-003
T-004
T-101
T-102
T-103
T-104
T-201
T-202
T-203
T-204
T-205
T-206
T-207
T-208
T-209
T-210
T-211
T-212
T-213
T-214
T-215
T-216
T-217
T-218
T-219
T-220
T-221
T-222
T-223
T-224
T-225
T-226
T-227
T-228
T-229
T-230
T-231
T-232
T-233
T-234
T-235
T-236
T-237
T-238
T-239
T-240
T-241
T-242
T-243
T-244
T-245
T-246
T-247
T-248
T-249
T-250
T-251
T-252
T-253
T-254
T-255
T-256
T-257
T-258
T-259
T-260
T-261
T-262
T-263
T-264
T-265
T-266
T-267
T-268
T-269
T-270
T-271
T-272
T-273
T-274
T-275
T-276
T-277
T-278
T-279
T-280
T-281
Task-Template
Tasks
agent-context
api
clean-state-checklist
current-state
routes
Clone
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
同步来源:
docs/tasks/T-226.md· commitafc651f75a3a
id: T-226 title: Go ERP 会话管理与 Admin 验证码登录 phase: 2 deps:
- T-225
status: DONE
created: 2026-07-29
context_ref:
d62a4afwork_branch: null write_paths: - docs/tasks/T-226.md
- docs/04-architecture.md
- docs/api.md
- docs/routes.md
- docs/current-state.md
- backend-api/internal/config/**
- backend-api/internal/platform/shunyunbao/**
- backend-api/internal/transport/httpapi/**
- backend-api/internal/transport/webui/**
- backend-api/cmd/api/**
问题 / 背景
直接 Go 查询需要让后端在同一 ERP 会话中获取验证码、登录、验证状态和发起查询。账号 密码不能输入到普通 Admin 表单,Cookie/JWT 不能发给浏览器;同时单机验证版不需要为 恢复会话额外部署 Redis。
关联需求与交互
- 功能:F-011。
- 用户故事:US-011。
- 交互:IX-012 增加 ERP 连接状态、获取验证码和提交验证码。
- 架构:一个受互斥保护的 Go 会话管理器服务一个受配置 ERP 账号;进程重启后会话失效, 需要人员重新登录。
方案
- ERP base URL、用户名和密码只从后端启动环境读取;不读取
.env,不保存到 SQLite、 Cookie、浏览器、普通日志或 API 响应。 - Admin 连接页显示匿名会话状态,可请求一次性验证码图片并输入验证码登录。图片响应
必须
no-store,浏览器只得到验证码图片和短期 ticket,不能得到 ERP Cookie/JWT。 - 会话管理器为 Cookie jar、token、用户最小标识和 ticket 建立串行锁;查询、验证码 和登录不能并发改变同一会话。
- 账号/密码未配置、验证码过期、登录拒绝、会话过期和 ERP 不可用均返回稳定匿名错误。
- 首版只保留内存会话;加密持久化会话须另立任务,不引入 Redis。
验收要点
- 配置缺失、验证码获取、错误/过期验证码、登录成功、会话过期和并发请求有单元/HTTP 测试。
- Admin 页面在桌面和手机视口显示状态、验证码和可修复错误,不显示密码、Cookie、JWT 或验证码文本。
- 会话请求和查询共享同一受控 Cookie jar;进程重启后明确要求重新登录。
go test ./...、go vet ./...通过;未访问线上 ERP。
边界
- 不自动 OCR、猜测或绕过验证码。
- 不实现多 ERP 账号、多租户、Redis 或凭证 Web 编辑。
- 不切换货运同步查询源;属于 T-227。
执行记录
- 2026-07-29:由 T-225 依赖创建,等待协议契约完成。
- 2026-07-29:开始实施;T-225 已由
c2f340d完成,当前仍未访问线上 ERP。 - 2026-07-29:新增
SessionManager,以同一受锁 Cookie jar 完成验证码、登录和/am/user/get校验;只保存内存会话,验证码 ticket 默认 5 分钟后失效。账号/密码仅由CMROUBAO_SHUNYUNBAO_*环境读取,未配置不会阻止其他后端功能启动。 - 2026-07-29:新增 ADMIN 的
/erp连接页和/api/v1/erp-session*接口;所有写接口 继续受 ADMIN CSRF middleware 保护。浏览器页面只输入验证码,图片和 ticket 均no-store, 不返回 ERP Cookie、JWT、用户资料、密码或原始错误正文。 - 验证:在
backend-api/执行$env:GOTOOLCHAIN='local'; go test ./...; go test -race ./...;go vet ./...; go build ./cmd/api; go build ./cmd/migrate; go build ./cmd/authctl,全部通过。 会话/HTTP/SSR 使用httptest伪 ERP;未访问线上 ERP。 - UI smoke:隔离 SQLite 上以
smoke-admin登录实际 Gin 服务,Chrome 以 1440x900 和 390x844 验证/erp未配置状态无横向溢出;截图只写入系统临时目录,未进仓库。 - 未验证项:真实 ERP 凭证、人工验证码和厂商授权检查有意留给部署前人员操作;T-227 才把会话接入货运同步 source。