Files
cmroubao/docs/tasks/T-235.md
T

64 lines
3.0 KiB
Markdown
Raw Blame History

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.
---
id: T-235
title: 修复顺运宝登录后用户会话校验协议
phase: 2
deps:
- T-234
status: DONE
created: 2026-07-29
context_ref: 4cf2151
work_branch: null
write_paths:
- docs/tasks/T-235.md
- docs/api.md
- docs/current-state.md
- docs/integrations/shunyunbao-contract.md
- backend-api/internal/platform/shunyunbao/**
- backend-api/internal/transport/httpapi/admin_handlers_test.go
---
## 问题 / 背景
真实诊断日志证明验证码 OCR `F4B8` 被 ERP 接受,`POST /am/auth/login` 返回
`status=true`、user 和 token;随后 Go 请求不带 query 的 `GET /am/user/get`,ERP 返回
`status=false`、`msg=没有任何操作`。原 Python 合约明确要求
`GET /am/user/get?id=<登录响应中的 user.id>`。当前 Go 只用 `hasUser` 判断 user 存在,既未
保存/传递 `user.id`,又把用户接口任意 `status=false` 都归类为会话失效,最终在 Web 层表现为
泛化 `503`。
## 方案
1. 登录成功后从 `data.user` 严格解析正整数 ID 和非空 username,仅保存在受锁内存会话中;
不保存或返回登录 token。
2. 使用 `url.Values` 构造 `GET /am/user/get?id=<id>`,保持同一 Cookie jar;响应必须包含相同
ID 和 username,否则清除内存认证身份并返回 `ERP_RESPONSE_INVALID`。
3. 后续 Validate/货运查询复用已确认身份。HTTP 401/403 或 ERP code `-2` 才归类为
`ERP_SESSION_REQUIRED`;其他业务 `status=false` 归类为 `ERP_RESPONSE_INVALID`,不再误报
会话失效/泛化 503。
4. 以脱敏 fixture 覆盖 user id query、身份一致性、非 `-2` 错误分类、`-2`/401 会话失效、
Cookie 复用和查询流程;日志不得输出 user id、username、token 或 query。
## 验收要点
- [x] 登录成功后的用户校验请求包含登录响应中的唯一 `id`,且复用登录 Cookie。
- [x] 用户响应 ID/username 必须与登录身份一致;缺失、冲突或普通 `status=false` 返回
`ERP_RESPONSE_INVALID`。
- [x] 仅 HTTP 401/403 或 ERP code `-2` 清除认证并返回 `ERP_SESSION_REQUIRED`。
- [x] Admin 不再因缺失 user id 得到 `freight_import_failed status=503`;该协议失败若重现应显示
`ERP_RESPONSE_INVALID`。
- [x] 标准 Go 测试、race、vet 和三个入口构建通过。
## 边界
- 不修改 OCR、验证码重试、ERP 账号密码、登录 token 持久化、货运字段、数据库或采购流程。
- 不在自动测试中访问真实 ERP;真实单号 smoke 由部署者重启后执行。
## 执行记录
- 2026-07-29:创建任务。真实日志已排除 OCR、网络和账号密码;对照
`D:/chengma/shunyunbaoerp/shunyunbaoerp_single.py` 确认 Go 遗漏用户接口的 `id` query,
并发现非 `-2` 响应被过度归类为会话失效。
- 2026-07-29:实现受锁内存 session identity、结构化 user id query、ID/username 一致性校验
和精确 session error 分类;更新 source/Admin 脱敏 fixture,并验证 diagnostics 不输出 query
或用户身份。标准 Go 测试、race、vet 及 api/migrate/authctl 构建均通过。