1. OpenClaw 报 session expired 与 Authentication token invalid 到底卡在哪
OpenClaw 是一个把大模型能力接进本地终端的命令行工具,你可以把它理解成一个“住在你终端里的 AI 助手”:敲一行openclaw "分析这段代码",它就去调用背后的模型接口,把结果打回屏幕。它适合谁?适合习惯在终端里干活、又想把模型调用嵌进脚本或 CI 流程的开发者。而session expired、Authentication token invalid、token_expired、OAuth token invalid这几类报错,本质是同一件事的不同外衣——OpenClaw 手里那份“身份凭证”失效了,服务端不认它了。
先看几个真实会撞上的报错形态:
$ openclaw "分析代码" Error: Session expired Your session has expired. Please re-authenticate. $ openclaw --print "task" Error: 401 Unauthorized Invalid authentication token. $ openclaw "task" Error: token_expired Your API token has expired. Please refresh. $ openclaw Error: OAuth token invalid Please re-authenticate.这四种报错分别对应不同的失效路径:Session expired多半是交互式会话超时;401 Unauthorized是密钥本身无效或被撤销;token_expired是令牌到了时限;OAuth token invalid则是 OAuth 刷新链路断了。很多人一看到报错就去重装 OpenClaw,其实完全没必要——问题不在程序,在凭证。
我踩过的坑是:一开始只盯着环境变量,反复export新 Key 却还是 401,后来才发现 OpenClaw 会优先读auth.json里的字段,环境变量反而被覆盖了。所以排查顺序应该是先看 auth.json,再看环境变量,最后才怀疑网络。这篇就按这个顺序,把auth.json的字段配置、可复制的 JSON 片段、逐步验证动作全部拆开讲,目标是一次性把 token 失效类报错排干净。
需要说明的是,下面所有配置示例里的 Base URL 和 Key,都可以换成你自己的接入端点。如果你手头还没有可用的 Key,可以先去 TaoToken 的 API Keys 页面 生成一个,再回来对照配置。整个流程不涉及任何网络工具,纯本地文件操作加一条 curl 验证。
2. 动手前的前置准备:auth.json 在哪、字段长什么样
在改任何东西之前,先搞清楚 OpenClaw 到底从哪里读凭证。不同版本略有差异,但主流路径是这几个:
~/.openclaw/auth.json # 主凭证文件,优先级最高 ~/.openclaw/credentials.json # 旧版 OAuth 凭证 ~/.openclaw/session* # 会话缓存你可以先用一条命令把目录结构看清楚:
ls -la ~/.openclaw/如果auth.json存在,直接看内容(注意别把 Key 贴到公开地方):
cat ~/.openclaw/auth.json一个标准的auth.json结构大致是这样,字段名和层级要和你的版本对齐:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-xxxxxxxxxxxxxxxx", "model": "claude-sonnet-4-20250514", "auth_type": "api_key", "expires_at": null }这里每个字段都有讲究。base_url是请求端点,末尾不要带多余斜杠;api_key是身份凭证本体;model是默认调用的模型 ID,写错会报模型不存在而不是认证错误,别混淆;auth_type决定走 API Key 还是 OAuth,如果你用的是 Key 却写成oauth,就会一直触发OAuth token invalid;expires_at为null表示不过期,如果是时间戳,过期后就会抛token_expired。
如果你还没生成 Key,先去 TaoToken 控制台 创建,拿到形如sk-开头的字符串。生成后建议先别急着写进文件,用第 4 节的 curl 验证一遍有效性,确认能用再落盘,能省掉一轮“到底是 Key 错还是配置错”的纠结。
另外提醒一点:auth.json的权限要收紧,否则某些版本会因为权限过宽拒绝读取:
chmod 600 ~/.openclaw/auth.json这一步很多人忽略,结果文件明明写对了却还是报认证失败,白白绕远路。
3. 可复制的 auth.json 配置与三件套对齐
这一节是核心。OpenClaw 的认证问题,九成出在“三件套”没对齐:Base URL、Key、Model ID。三者必须来自同一个接入端点,混用就会 401。下面给你一份可直接复制的auth.json,路径就是~/.openclaw/auth.json:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-替换成你自己的Key", "model": "claude-sonnet-4-20250514", "auth_type": "api_key", "expires_at": null, "timeout": 60 }写入方式用 heredoc 最稳,避免编辑器引入不可见字符:
cat > ~/.openclaw/auth.json << 'EOF' { "base_url": "https://taotoken.net/api", "api_key": "sk-替换成你自己的Key", "model": "claude-sonnet-4-20250514", "auth_type": "api_key", "expires_at": null, "timeout": 60 } EOF chmod 600 ~/.openclaw/auth.json如果你更习惯用环境变量兜底,可以同时设置,但要知道优先级:auth.json 高于环境变量。所以当你改了环境变量却没生效时,先回头看看 auth.json 是不是还留着旧 Key。
export ANTHROPIC_API_KEY=sk-替换成你自己的Key export ANTHROPIC_BASE_URL=https://taotoken.net/api想永久生效就写进 shell 配置:
echo 'export ANTHROPIC_API_KEY=sk-替换成你自己的Key' >> ~/.bashrc echo 'export ANTHROPIC_BASE_URL=https://taotoken.net/api' >> ~/.bashrc source ~/.bashrc三件套对照表,方便你逐项核对:
| 配置项 | auth.json 字段 | 环境变量 | 常见错误 |
|---|---|---|---|
| Base URL | base_url | ANTHROPIC_BASE_URL | 末尾多斜杠、写成网页地址 |
| Key | api_key | ANTHROPIC_API_KEY | 复制时带空格、Key 已撤销 |
| Model ID | model | 无 | 写成展示名而非 ID |
这里要特别强调:base_url填的是 API 端点,不是官网首页。很多人把https://taotoken.net直接填进去,结果请求打到网页路径上,返回一堆 HTML,OpenClaw 解析失败就报认证异常。正确写法是https://taotoken.net/api。如果你用的是 Claude Code 这类工具,配置思路一致,只是文件位置换成对应的 settings 文件,字段名可能叫env包裹,但三件套逻辑不变。
写完别急着跑复杂任务,先用最简单的--print验证,下一节讲。
4. 逐步验证:从 curl 到 openclaw --print 的成功结果
配置写完,验证要分层做,一层层排除,别一上来就跑大任务。第一层,先用 curl 直接打接口,确认 Key 和端点本身是通的:
curl -s https://taotoken.net/api/v1/messages \ -H "x-api-key: sk-替换成你自己的Key" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{"model":"claude-sonnet-4-20250514","max_tokens":10,"messages":[{"role":"user","content":"hi"}]}'如果返回里带content字段和一段文本,说明 Key 有效、端点正确。如果返回401,Key 无效或被撤销;返回403,是权限或账户限制;返回404,多半是base_url路径写错了。这一步能把“网络问题”和“凭证问题”彻底分开。
第二层,验证 OpenClaw 是否读到了配置:
openclaw --print "hello"成功时你会看到模型返回的一句问候,类似:
Hello! How can I help you today?如果这一步还报Session expired,说明 OpenClaw 读的不是你刚写的 auth.json,检查路径和权限;如果报401,说明读到了但 Key 不对,回到第 3 节核对三件套。
第三层,清掉可能残留的旧会话缓存再试:
rm -rf ~/.openclaw/session* rm -rf ~/.openclaw/credentials.json openclaw --print "hello"旧缓存里可能存着已经失效的 OAuth 令牌,不清掉的话,即使 auth.json 写对了,程序也可能优先用缓存里的旧凭证,继续抛OAuth token invalid。清完再验证一次,通常就恢复了。
第四层,跑一个真实小任务确认端到端可用:
openclaw "用一句话解释什么是递归"能正常返回解释,说明会话恢复完成。到这里,session expired和Authentication token invalid应该都不再出现。如果你还想在浏览器里直观对比模型输出,可以打开 TaoToken 模型对话 页面,用同一个 Key 试一句,两边结果一致就说明配置没问题。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
排障最怕对着报错瞎猜,下面把几个高频报错和真实原因对上号。
401 Unauthorized / Invalid authentication token:Key 无效、被撤销,或 auth.json 里的 Key 和环境变量冲突。先cat ~/.openclaw/auth.json看实际值,再 curl 验证。注意 Key 复制时首尾容易带空格或换行,用echo -n检查长度。
local proxy failed:这个报错和认证无关,通常是本地端口被占或代理配置残留。检查是否有旧的 OpenClaw 进程没退干净:
ps aux | grep openclaw kill -9 <PID>然后确认没有多余的HTTP_PROXY环境变量干扰:
env | grep -i proxy有就unset掉再试。
Error reading choices / reading choices:这是响应解析失败,多半是base_url指到了网页而非 API,返回了 HTML,程序按 JSON 解析就崩了。确认base_url是https://taotoken.net/api这种纯接口路径,末尾不带/v1之外的冗余段。
OAuth token invalid:如果你用的是 API Key,却把auth_type写成了oauth,就会一直走 OAuth 刷新逻辑然后失败。把auth_type改回api_key,并删掉credentials.json里的旧 OAuth 残留。
token_expired:检查expires_at字段,如果是过去的时间戳,改成null或重新生成 Key。
对照表再收一遍:
| 报错 | 最可能原因 | 处理动作 |
|---|---|---|
| 401 Unauthorized | Key 无效/冲突 | 核对 auth.json 与 curl 验证 |
| local proxy failed | 进程残留/代理变量 | kill 进程、unset proxy |
| reading choices | base_url 指向网页 | 改为 API 端点 |
| OAuth token invalid | auth_type 写错 | 改回 api_key 并清缓存 |
| token_expired | expires_at 过期 | 置 null 或换 Key |
排查时建议一次只改一个变量,改完立刻验证,否则多个改动叠加,成功了也不知道是哪一步起的作用。这套方法我在多个终端工具上都用过,逻辑是通用的。
6. 长期稳定:把凭证管理变成习惯
会话过期这类问题,本质是凭证生命周期管理没跟上。给你几个能长期省事的做法。
CI/CD 场景用 API Key,因为它不会自动过期,适合无人值守;交互式本地开发可以用 OAuth,让它自动刷新。但无论哪种,都别把 Key 硬编码进脚本提交到仓库。用.env文件加.gitignore隔离:
cat > .env << 'EOF' ANTHROPIC_API_KEY=sk-替换成你自己的Key ANTHROPIC_BASE_URL=https://taotoken.net/api EOF echo '.env' >> .gitignore加载时用set -a; source .env; set +a,比export $(cat .env | xargs)更稳,能处理带空格的值。
如果你要长期跑编码类任务或 Agent 流程,频繁手动换 Key 很烦,可以考虑用 TaoToken Coding Plan 这类面向持续调用的方案,减少凭证轮换频率。配置细节和字段说明可以对照 接入文档 逐项核对,文档里的字段名和本文示例保持一致,照着改不会错位。
最后留一个自查清单,下次再撞上 session expired,按顺序过一遍就行:
1. cat ~/.openclaw/auth.json 看三件套 2. curl 打 /v1/messages 验证 Key 3. openclaw --print "hello" 验证读取 4. rm -rf ~/.openclaw/session* 清缓存 5. chmod 600 ~/.openclaw/auth.json 收权限 6. env | grep -i proxy 排代理干扰 7. 401=Key 问题,403=权限问题,reading choices=端点问题把这几步跑完,token 失效类报错基本一次清干净。真正省时间的不是记住所有报错,而是记住“先看 auth.json,再 curl,最后清缓存”这个固定顺序。