问题位置:
- 定义:
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 注释明确承诺:
- 收到 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 才能重新注册)。
修复建议(按推荐顺序):
- 在
ApiServiceWrapper._dio.interceptors 中加一个 auth 拦截器:捕获响应 401,调用 DeviceAuthService.instance.renewToken(),仅重试 1 次后透传原响应。这样不修改每个业务调用点。
- 在
LogReporterService._dio 上加同样的拦截器。
- 如果担心拦截器副作用,至少在
authedHeaders() 内增加"401 后自动 renew"路径:让 provider 自身在拿到 401 时重新走 register。但这要求调用方把 401 信号传回 provider,与 dio 拦截器方案相比侵入性更大。
建议优先方案 1 + 2,并在拦截器内幂等保证(同一并发请求组只触发一次续签,避免雪崩)。
忽略指南:在项目根 .cr-ignore.md 追加:
- issue: <CR_IGNORE_IID_NUM>
reason: <你的理由>
下次审查会自动关闭。
问题位置:
lib/services/device/device_auth_service.dart:145(renewToken())lib/services/api_service_wrapper.dart各方法(Dio 默认对 4xx 抛DioException,但无拦截器捕获并触发续签)grep renewToken:仅自身定义和 doc 注释命中,0 个真实调用点问题:
DeviceAuthService模块顶部 doc 注释明确承诺:renewToken()已实现(清缓存后走完整register(),利用服务端去重),但全仓库 grep 不到任何调用。本次ed980507把以下原本用静态X-API-TOKEN(无过期概念)的端点切到设备 JWT:uploadBackuplib/services/api_service_wrapper.dart:230getBackupListlib/services/api_service_wrapper.dart:280downloadBackuplib/services/api_service_wrapper.dart:317deleteBackupOnServerlib/services/api_service_wrapper.dart:350getText2ImgModelslib/services/api_service_wrapper.dart:383submitText2ImgTasklib/services/api_service_wrapper.dart:415fetchText2ImgImagelib/services/api_service_wrapper.dart:455submitImageToVideoTasklib/services/api_service_wrapper.dart:499fetchImageToVideoVideolib/services/api_service_wrapper.dart:539LogReporterService._uploadlib/services/log_reporter_service.dart:264影响:
device_auth_service.dart:9注释 "JWT 只是 30 天期的会话凭证")。X-API-TOKEN没有过期概念,认证失败由"凭据遗失"导致,不会大面积集体失效。新设计把失效半径从单次手工配置失误放大到"30 天周期事件"。X-API-TOKEN一旦配错用户可手动修改;新 JWT 失败没有任何用户可触发的恢复路径,只能重装 APP(设备 JWT 仍会重新走注册流程、首次仍然会失败因 30 天期限已到?实际是 30 天后用户重新打开 APP,_cachedToken仍是过期值,ensureRegistered看到非 null 直接返回,鉴权永远 401,必须清 SharedPreferences 才能重新注册)。修复建议(按推荐顺序):
ApiServiceWrapper._dio.interceptors中加一个 auth 拦截器:捕获响应401,调用DeviceAuthService.instance.renewToken(),仅重试 1 次后透传原响应。这样不修改每个业务调用点。LogReporterService._dio上加同样的拦截器。authedHeaders()内增加"401 后自动 renew"路径:让 provider 自身在拿到 401 时重新走 register。但这要求调用方把 401 信号传回 provider,与 dio 拦截器方案相比侵入性更大。建议优先方案 1 + 2,并在拦截器内幂等保证(同一并发请求组只触发一次续签,避免雪崩)。
忽略指南:在项目根
.cr-ignore.md追加:reason: <你的理由>
下次审查会自动关闭。