Files
platforms/docs/操作日志_工作人员端令牌失效恢复_20260905.md

57 lines
4.6 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.
# 工作人员端令牌失效恢复操作日志
操作时间2026-09-05 19:44:58
操作类型:修改、扩展
影响模块:工作人员端请求层、会话管理、鉴权路由、登录页、业务页面刷新及本地 Web 运行方式
## 操作前状态
浏览器保留工作人员登录状态,但令牌已被后端拒绝。作业前检查接口实际返回 HTTP 401客户端却将其显示为“请检查网络”并因路由继续把本地令牌视为有效而无法返回登录页。点击“重新加载”还会将异步任务从 `setState` 回调返回,在 Flutter 调试模式触发断言;相同写法在作业检查、个人资料和任务详情中共有 7 处。
## 具体操作
1. 请求层保存每个请求实际使用的令牌,统一识别受保护请求的 HTTP 401 与业务码 `1301—1314``1715`
2. 普通 JSON 请求和文件上传均通知会话层并抛出专用失效异常;匿名登录请求不触发清理。
3. 会话层仅处理与当前令牌一致的拒绝通知,幂等清除令牌、工作人员标识和角色,并保留设备标识。
4. 持久化字段逐项尽力删除;新登录写入前等待旧清理任务结束,避免迟到旧请求和删除任务破坏新会话。
5. 路由将失效前的站内目标页写入登录地址,并通过 `reason=expired` 展示明确提示;重新登录后安全回跳。
6. 页面层忽略专用会话失效异常,不再重复显示普通网络错误,也不自动重放写操作。
7. 将全部 7 处异步 `setState` 赋值改为同步状态回调,并新增统一页面刷新方法。
8. 新增请求层、会话层、路由、安全回跳和作业检查重试测试,同步需求、安全和项目文档。
9. 构建连接本地后端 `12426` 的 Release Web 产物,将 `5181` 从 Flutter 调试服务切换为隐藏的静态服务。
## 操作后状态
工作人员端遇到失效令牌后会立即停止当前页面错误展示,清理会话并进入登录页,显示“登录状态已失效,请重新登录”。登录地址保留合法原目标页,重新登录后可返回;非法或缺失目标默认进入作业前检查。写操作不会自动重放,设备标识不会因会话失效丢失。所有已知页面刷新入口不再向 `setState` 返回 `Future`
## 代码变更
- `apps/service_app/lib/data/services/api_client.dart`+58/-15统一鉴权失效识别、令牌快照、专用异常和上传处理。
- `apps/service_app/lib/app/dependencies.dart`+57/-15会话清理、设备保留、幂等及竞态保护。
- `apps/service_app/lib/data/services/secure_session_store.dart`+18/-1新增可测试的会话存储接口。
- `apps/service_app/lib/app/auth_navigation.dart`(新增 32 行):登录地址构造和站内目标校验。
- `apps/service_app/lib/app/router.dart`+21/-5、登录页+15/-2失效跳转、提示和登录后回跳。
- 作业检查、个人资料、任务详情、任务列表与取证页面(合计 +65/-8鉴权错误抑制与同步刷新。
- `apps/service_app/test/app/``test/data/api_client_test.dart``test/ui/preflight_page_test.dart`(新增 448 行):鉴权、并发、回跳和重试回归测试。
- `docs/04-服务端App需求.md``docs/11-数据接口与安全.md`:同步功能和安全约束。
- `docs/项目文档_工作人员端令牌失效恢复_v1.0.md`(新增 77 行):记录结构、行为、维护方法和边界。
## 验证结果
- `flutter analyze --no-pub`:通过,无问题。
- `flutter test --no-pub`:通过,共 20 项测试。
- 作业检查组件测试实际执行首次失败和点击重试,确认页面恢复且无 Flutter 断言。
- `flutter build web --release --no-pub --dart-define=API_BASE_URL=http://127.0.0.1:12426`:通过。
- 本地 `5181` 已由 Python Release 静态服务监听并返回 HTTP 200`12426` 后端健康检查返回 HTTP 200。
- 浏览器端到端验证:原 `/preflight` 页面携带残留失效令牌刷新后,实际跳转至 `/login?redirect=/preflight&reason=expired`,并显示“登录状态已失效,请重新登录”。
## 风险评估
- 会话失效按请求令牌快照与当前令牌比对,避免并发请求或重新登录期间的旧响应清除新会话。
- 持久化删除失败时,当前运行仍可立即恢复登录;下次全新启动可能再次读取旧值并重新触发清理。
- 回跳只接受站内绝对路径并排除登录页,降低开放重定向和登录循环风险。
- 打卡、取证、上传和任务状态操作不自动重放,避免重复副作用。
- 后端接口、JWT 生命周期、数据库和普通错误文案均未修改。