环境
- 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 才能恢复。
根因(代码级)
drivers/baidu_netdisk/driver.go 的 Init() 直接 get("/xpan/nas", {"method":"uinfo"}),用 addition 里缓存的 AccessToken,事前不调用 refreshToken()
drivers/baidu_netdisk/util.go 的 request() 只在 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=uinfo → errno: 0(用户信息正常返回)
- 用 addition 中缓存的旧 AccessToken 调同一接口 →
{"errno":20017,"show_msg":"nas access token invalid"}
- 把新 access_token 写回 addition 再 storage/update → init 立即成功
另注:百度 refresh_token 每次刷新都会轮换(旧值立即作废),因此排查时需沿最新值操作。
建议修复(任选其一)
Init() 开头无条件 refreshToken() 一次(或 uinfo 失败时刷新重试)
- 把
20017(以及可能存在的其他 token 失效码)加入 request() 的刷新触发列表
相关代码
drivers/baidu_netdisk/driver.go Init():49-70
drivers/baidu_netdisk/util.go request() errno 判断:117-122
环境
openlistteam/openlist:v4.2.5-aio镜像,docker)use_online_api=false,自备 AppKey/SecretKey)现象
存储状态报错,且无法自愈:
即使 addition 里的
refresh_token完全有效(手动 OAuth 刷新一次即成功),storage update 后 init 依然报 20017,只有把新 access_token 手工写回 addition 才能恢复。根因(代码级)
drivers/baidu_netdisk/driver.go的Init()直接get("/xpan/nas", {"method":"uinfo"}),用 addition 里缓存的 AccessToken,事前不调用refreshToken()drivers/baidu_netdisk/util.go的request()只在errno ∈ {111, -6}时触发refreshToken(),而百度对失效 token 返回的 20017("nas access token invalid")不在触发列表 → 死循环:每次 init 用旧 token → 20017 → 报错退出,永不刷新验证证据
同一时刻(同一 refresh_token 轮换链上):
pan.baidu.com/rest/2.0/xpan/nas?method=uinfo→errno: 0(用户信息正常返回){"errno":20017,"show_msg":"nas access token invalid"}另注:百度 refresh_token 每次刷新都会轮换(旧值立即作废),因此排查时需沿最新值操作。
建议修复(任选其一)
Init()开头无条件refreshToken()一次(或 uinfo 失败时刷新重试)20017(以及可能存在的其他 token 失效码)加入request()的刷新触发列表相关代码
drivers/baidu_netdisk/driver.goInit():49-70drivers/baidu_netdisk/util.gorequest() errno 判断:117-122