Skip to content

百度网盘驱动:init 不刷新 token,errno 20017 不触发自动刷新导致存储无法自愈 #2922

Description

@talwayh1

环境

  • OpenList v4.2.5(官方 openlistteam/openlist:v4.2.5-aio 镜像,docker)
  • 百度网盘存储,本地 OAuth 路径(use_online_api=false,自备 AppKey/SecretKey)

现象

存储状态报错,且无法自愈:

failed init storage: req: [https://pan.baidu.com/rest/2.0/xpan/nas] ,errno: 20017, refer to https://pan.baidu.com/union/doc/

即使 addition 里的 refresh_token 完全有效(手动 OAuth 刷新一次即成功),storage update 后 init 依然报 20017,只有把新 access_token 手工写回 addition 才能恢复。

根因(代码级)

  1. drivers/baidu_netdisk/driver.goInit() 直接 get("/xpan/nas", {"method":"uinfo"}),用 addition 里缓存的 AccessToken,事前不调用 refreshToken()
  2. drivers/baidu_netdisk/util.gorequest() 只在 errno ∈ {111, -6} 时触发 refreshToken(),而百度对失效 token 返回的 20017("nas access token invalid")不在触发列表 → 死循环:每次 init 用旧 token → 20017 → 报错退出,永不刷新

验证证据

同一时刻(同一 refresh_token 轮换链上):

  • 手动 OAuth 刷新拿新 access_token 后,直调 pan.baidu.com/rest/2.0/xpan/nas?method=uinfoerrno: 0(用户信息正常返回)
  • 用 addition 中缓存的旧 AccessToken 调同一接口 → {"errno":20017,"show_msg":"nas access token invalid"}
  • 把新 access_token 写回 addition 再 storage/update → init 立即成功

另注:百度 refresh_token 每次刷新都会轮换(旧值立即作废),因此排查时需沿最新值操作。

建议修复(任选其一)

  1. Init() 开头无条件 refreshToken() 一次(或 uinfo 失败时刷新重试)
  2. 20017(以及可能存在的其他 token 失效码)加入 request() 的刷新触发列表

相关代码

  • drivers/baidu_netdisk/driver.go Init():49-70
  • drivers/baidu_netdisk/util.go request() errno 判断:117-122

Metadata

Metadata

Assignees

No one assigned

    Labels

    invalidInvalid Content/Cannot Reproduce

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions