Skip to content

DeviceAuthService.renewToken() 全代码库无调用方;401 自动续签机制缺失,本次改动后 30 天 JWT 过期将致 10 个鉴权端点集体失败 #48

Description

@yunkst

问题位置

  • 定义:lib/services/device/device_auth_service.dart:145 (renewToken())
  • 401 抛出处:lib/services/api_service_wrapper.dart 各方法(Dio 默认对 4xx 抛 DioException,但无拦截器捕获并触发续签)
  • 全代码库 grep renewToken:仅自身定义和 doc 注释命中,0 个真实调用点

问题DeviceAuthService 模块顶部 doc 注释明确承诺:

  1. 收到 401(token 过期/无效)时调用 [renewToken]——同 android_id 重注册,服务端去重不会重复发额度,只补发新 JWT

renewToken() 已实现(清缓存后走完整 register(),利用服务端去重),但全仓库 grep 不到任何调用。本次 ed980507 把以下原本用静态 X-API-TOKEN(无过期概念)的端点切到设备 JWT:

端点 文件:行
uploadBackup lib/services/api_service_wrapper.dart:230
getBackupList lib/services/api_service_wrapper.dart:280
downloadBackup lib/services/api_service_wrapper.dart:317
deleteBackupOnServer lib/services/api_service_wrapper.dart:350
getText2ImgModels lib/services/api_service_wrapper.dart:383
submitText2ImgTask lib/services/api_service_wrapper.dart:415
fetchText2ImgImage lib/services/api_service_wrapper.dart:455
submitImageToVideoTask lib/services/api_service_wrapper.dart:499
fetchImageToVideoVideo lib/services/api_service_wrapper.dart:539
LogReporterService._upload lib/services/log_reporter_service.dart:264

影响

  • 设备 JWT 有效期 30 天(device_auth_service.dart:9 注释 "JWT 只是 30 天期的会话凭证")。
  • 30 天后以上所有鉴权请求一律 401:备份上传/列表/下载/删除、文生图模型列表/任务提交/取图、图生视频提交/取视频、日志上报(全 10 个路径)。
  • X-API-TOKEN 没有过期概念,认证失败由"凭据遗失"导致,不会大面积集体失效。新设计把失效半径从单次手工配置失误放大到"30 天周期事件"。
  • X-API-TOKEN 一旦配错用户可手动修改;新 JWT 失败没有任何用户可触发的恢复路径,只能重装 APP(设备 JWT 仍会重新走注册流程、首次仍然会失败因 30 天期限已到?实际是 30 天后用户重新打开 APP,_cachedToken 仍是过期值,ensureRegistered 看到非 null 直接返回,鉴权永远 401,必须清 SharedPreferences 才能重新注册)。

修复建议(按推荐顺序):

  1. ApiServiceWrapper._dio.interceptors 中加一个 auth 拦截器:捕获响应 401,调用 DeviceAuthService.instance.renewToken()仅重试 1 次后透传原响应。这样不修改每个业务调用点。
  2. LogReporterService._dio 上加同样的拦截器。
  3. 如果担心拦截器副作用,至少在 authedHeaders() 内增加"401 后自动 renew"路径:让 provider 自身在拿到 401 时重新走 register。但这要求调用方把 401 信号传回 provider,与 dio 拦截器方案相比侵入性更大。

建议优先方案 1 + 2,并在拦截器内幂等保证(同一并发请求组只触发一次续签,避免雪崩)。


忽略指南:在项目根 .cr-ignore.md 追加:

  • issue: <CR_IGNORE_IID_NUM>
    reason: <你的理由>
    下次审查会自动关闭。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions