老代码还在用 AK/SK 拼 URL 里的 access_token,调用返回 110 或 401,提示鉴权失败,token 已过期,重新换一个又能撑一阵子。
把日志和配置对完,能解释这个现象的基本就这几处。access_token 有效期只有三十天,过期必须重换;v2 接口已改成 Bearer 鉴权,不再用 URL 里的 token;AK/SK 填反或复制时漏了字符;服务里缓存了 token 却没有刷新逻辑。
上来先用 AK/SK 换一个有效期内的 token
curl -X POST 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=$AK&client_secret=$SK'
v2 接口改用 Bearer 头直接传 API Key
curl https://qianfan.baidubce.com/v2/chat/completions -H "Authorization: Bearer $QIANFAN_KEY" -d '{"model":"ernie-4.0-8k","messages":[{"role":"user","content":"hi"}]}'
随后在服务里加上过期前自动刷新
if time.time() > expire_at - 3600: refresh_token()
末了把刷新失败也打日志,避免静默失效
print({'expire_in': data['expires_in']})
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
改完先别撤,确认这几项。调用返回 200,响应里有 result 字段,日志中不再出现鉴权失败,服务连续跑一周不用手工换 token。
补一句。换 token 接口返回的 expires_in 是相对秒数,但实际到期时间要按本地时间换算,直接用相对时长缓存会在时钟偏移时提前失效。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。