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

4.6 KiB
Raw Blame History

工作人员端令牌失效恢复操作日志

操作时间2026-09-05 19:44:58

操作类型:修改、扩展

影响模块:工作人员端请求层、会话管理、鉴权路由、登录页、业务页面刷新及本地 Web 运行方式

操作前状态

浏览器保留工作人员登录状态,但令牌已被后端拒绝。作业前检查接口实际返回 HTTP 401客户端却将其显示为“请检查网络”并因路由继续把本地令牌视为有效而无法返回登录页。点击“重新加载”还会将异步任务从 setState 回调返回,在 Flutter 调试模式触发断言;相同写法在作业检查、个人资料和任务详情中共有 7 处。

具体操作

  1. 请求层保存每个请求实际使用的令牌,统一识别受保护请求的 HTTP 401 与业务码 1301—13141715
  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.darttest/ui/preflight_page_test.dart(新增 448 行):鉴权、并发、回跳和重试回归测试。
  • docs/04-服务端App需求.mddocs/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 20012426 后端健康检查返回 HTTP 200。
  • 浏览器端到端验证:原 /preflight 页面携带残留失效令牌刷新后,实际跳转至 /login?redirect=/preflight&reason=expired,并显示“登录状态已失效,请重新登录”。

风险评估

  • 会话失效按请求令牌快照与当前令牌比对,避免并发请求或重新登录期间的旧响应清除新会话。
  • 持久化删除失败时,当前运行仍可立即恢复登录;下次全新启动可能再次读取旧值并重新触发清理。
  • 回跳只接受站内绝对路径并排除登录页,降低开放重定向和登录循环风险。
  • 打卡、取证、上传和任务状态操作不自动重放,避免重复副作用。
  • 后端接口、JWT 生命周期、数据库和普通错误文案均未修改。