修复工作人员端令牌失效后的登录恢复

This commit is contained in:
czl231
2026-09-05 19:51:36 +08:00
parent 7ea39334eb
commit 1670d5880f
20 changed files with 849 additions and 46 deletions

View File

@@ -0,0 +1,56 @@
# 工作人员端令牌失效恢复操作日志
操作时间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 生命周期、数据库和普通错误文案均未修改。