
1. WSL 里 Claude Code 报 401 的真实场景拆解先说清楚这篇要解决什么。Claude Code 是 Anthropic 出的命令行编码助手能读你本地仓库、改代码、跑命令适合习惯在终端里干活的人。它默认走 OAuth2 登录你在终端敲/login它吐一个 URL你丢到浏览器里授权浏览器回一段 Authentication Code你粘回终端完成认证。问题就出在 WSL 这个环境里——WSL 的网络栈和 Windows 主机是两套浏览器在 Windows 侧、终端在 Linux 侧回调链路天然容易断于是你反复粘贴 Code终端却一直甩401给你。我先把典型症状摆出来你对号入座终端执行/login后拿到 URL浏览器授权显示成功但粘回 Code 后提示OAuth2 authentication failed或直接401 Unauthorized。之前明明登录成功过某天打开终端突然提示 401重新登录也进不去。报错里夹着local proxy failed、ECONNREFUSED、reading choices这类字眼。换到 Windows 原生 PowerShell 里跑同样的命令反而能登录。这几种表现背后其实是三类根因环境变量污染、代理链路不通、凭据缓存损坏。WSL 里你很可能同时装了公司代理、系统级HTTP_PROXY、还有一堆历史遗留的ANTHROPIC_*变量它们互相打架。再加上 WSL2 默认的 NAT 网络模式Windows 上的代理端口在 Linux 侧不一定能直连回调自然失败。还有一个容易被忽略的点Claude 服务端本身偶尔会抽风。每个月都可能撞上登录服务维护或故障窗口这时候你本地怎么折腾都没用。所以排查第一步不是改配置而是先确认服务端状态。你可以打开https://status.claude.com/看公告如果上面挂着 incident那就只能等别怀疑自己。那为什么还要写这篇因为服务端正常、你本地却持续 401 的情况更常见而且更折磨人。接下来我会从环境变量、代理、凭据缓存三个角度带你定位再给一套可复制的settings.json和config.toml骨架最后用 TaoToken 的统一 Key/API 通道做一条稳定的接入路径绕开 OAuth2 回调这个老大难。整套流程我自己在 WSL2 Ubuntu 22.04 上跑通过命令和配置都能直接抄。先明确一个判断标准如果你在 WSL 里执行curl -I https://api.anthropic.com都超时或返回 4xx那问题在网络层跟 OAuth2 无关如果能通但登录仍 401才轮到凭据和配置。这个分界线很重要能帮你省掉一半瞎折腾的时间。2. TaoToken 前置准备统一 Key 与 API 通道怎么搭在动手改配置前先把 TaoToken 这条通道准备好。它的作用是给你一个统一的 API 入口和 Key让 Claude Code 不再依赖 OAuth2 那套浏览器回调直接走 API Key 认证。对 WSL 用户来说这等于把最容易断的那一环直接砍掉。你需要准备三样东西Base URL、API Key、Model ID。这三件套是后面所有配置的核心缺一不可。Base URL 用https://taotoken.net/api注意这个地址不带任何查询参数直接填就行。API Key 要去控制台生成路径是https://taotoken.net/console进去后在 API Keys 页面新建一个复制出来保存好它只显示一次。Model ID 根据你用的模型填比如claude-sonnet-4-5这类具体以你账号里可用的为准。生成 Key 的入口我建议直接收藏https://taotoken.net/api-keys省得每次翻菜单。如果你还没注册官网在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content注册完再回来配。这里有个坑要提前说很多人把 Key 直接写进 shell 的export里结果 WSL 每次开新终端都重复叠加或者被.bashrc里的旧变量覆盖。正确做法是写进 Claude Code 自己的配置文件而不是全局环境变量。后面 §3 会给完整骨架。再强调一下三件套的对应关系别填错位置配置项值填在哪Base URLhttps://taotoken.net/apisettings.json的env.ANTHROPIC_BASE_URLAPI Key控制台生成settings.json的env.ANTHROPIC_AUTH_TOKENModel ID如claude-sonnet-4-5settings.json的model字段如果你用的是 Codex 或 Cline 这类工具配置位置不同但三件套不变。Codex 走~/.codex/auth.jsonCline 走 MCP 配置CC Switch 则是图形化切换。不管哪个Base URL、Key、Model ID 都是必须写全的少一个就连不上。准备阶段最后一步确认你的 WSL 能访问外网。执行curl -sS -o /dev/null -w %{http_code} https://taotoken.net/api返回 200 或 401 都说明网络通401 只是没带 Key。如果卡住或报Could not resolve host先解决 DNS别往下走。3. 可复制配置settings.json 与 config.toml 骨架这一节是全文的核心给你能直接抄的配置。Claude Code 的配置分两层全局的~/.claude/settings.json和项目级的.claude/settings.json。WSL 下建议先配全局项目级按需覆盖。先建目录再写文件mkdir -p ~/.claude touch ~/.claude/settings.json然后写入下面这份骨架。注意 JSON 不支持注释我在这里用文字说明每个字段你抄的时候别把说明带进去{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的Key粘贴在这里, ANTHROPIC_MODEL: claude-sonnet-4-5, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1 }, model: claude-sonnet-4-5, permissions: { allow: [], deny: [] } }几个关键点解释一下。ANTHROPIC_BASE_URL指向 TaoToken 的 API 入口这样 Claude Code 就不会去走 OAuth2 的登录端点。ANTHROPIC_AUTH_TOKEN放你的 Key注意是AUTH_TOKEN不是API_KEY这俩在 Claude Code 里行为不同写错了会 401。CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC设成 1 能关掉一些后台遥测请求减少 WSL 里的网络抖动。如果你更习惯 TOML 风格或者用的是支持config.toml的工具比如某些 Codex 场景骨架长这样[api] base_url https://taotoken.net/api api_key sk-你的Key粘贴在这里 model claude-sonnet-4-5 [network] timeout 60 retry 3这份config.toml一般放在~/.config/下对应工具的目录里具体路径看工具文档。核心还是那三件套位置换了但值不变。写完配置后一定要清掉 shell 里的旧环境变量否则它们会覆盖配置文件。检查一下env | grep -i anthropic如果输出里有ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL之类的去~/.bashrc或~/.zshrc里删掉对应的export行然后source ~/.bashrc重载。这一步不做你改多少遍配置文件都白搭因为环境变量优先级更高。还有个细节WSL 下文件权限偶尔会出问题导致 Claude Code 读不到配置。执行chmod 600 ~/.claude/settings.json收紧权限避免它因为权限过宽拒绝加载。配置写完后别急着登录先做一次语法校验python3 -c import json; json.load(open($HOME/.claude/settings.json)); print(JSON OK)输出JSON OK说明格式没问题。如果报JSONDecodeError多半是多了逗号或少了引号用编辑器的高亮功能逐行看。4. 验证请求确认认证是否真的恢复配置写完现在验证。分三步走每步都有明确的成功标志别跳步。第一步验证 API 通道本身通不通。用 curl 直接打 TaoToken 的接口带上你的 Keycurl -sS 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-5,max_tokens:16,messages:[{role:user,content:ping}]}如果返回一段 JSON里面有content字段和模型回复说明 Key 和通道都没问题。如果返回401检查 Key 有没有复制全、有没有多余空格。如果返回404检查 Base URL 是不是写成了带/v1的完整路径——ANTHROPIC_BASE_URL只填到/api后面的路径由 Claude Code 自己拼。第二步验证 Claude Code 能读到配置。在终端执行claude --version claude config listconfig list会打印当前生效的配置。重点看env.ANTHROPIC_BASE_URL是不是https://taotoken.net/apimodel是不是你设的值。如果这里显示的还是旧的 OAuth 相关配置说明配置文件没被加载回去检查路径和权限。第三步实际发一次对话请求。直接启动 Claude Codeclaude 用一句话说明这个仓库是做什么的成功的话它会直接返回模型输出不再弹/login的 URL。这一步过了说明认证彻底恢复OAuth2 那套回调链路已经被 API Key 通道替代。如果你更想先在网页端确认模型可用可以打开模型对话页面https://taotoken.net/models手动发一条消息看返回是否正常。这能帮你区分是 Key 的问题还是 Claude Code 配置的问题。验证过程中有个小技巧加--debug参数能看到详细的请求日志。claude --debug test日志里会打印实际请求的 URL 和 headers。如果看到请求打到了api.anthropic.com而不是taotoken.net说明ANTHROPIC_BASE_URL没生效八成是被环境变量覆盖了回到 §3 清理。三步都通过后建议把这条命令记下来以后换机器或重装 WSL 时按同样顺序验一遍能快速定位是哪一层出的问题。5. 本篇常见报错排查401、local proxy failed、reading choices这一节把你会撞到的报错逐个拆开对照真实错误信息给解法。报错一401 Unauthorized且提示invalid x-api-key。最常见。原因通常是 Key 写错位置或带了脏字符。检查settings.json里ANTHROPIC_AUTH_TOKEN的值确认没有换行、没有引号嵌套错误。用cat ~/.claude/settings.json | python3 -m json.tool格式化输出肉眼看一遍。还有一种情况是你把 Key 写进了ANTHROPIC_API_KEY而不是ANTHROPIC_AUTH_TOKEN这俩在 Claude Code 里语义不同换过来即可。报错二local proxy failed或ECONNREFUSED 127.0.0.1:xxxx。这是 WSL 里代理配置残留导致的。你之前可能设过HTTP_PROXYhttp://127.0.0.1:7890之类的变量但那个代理在 WSL 里根本没跑。清理方法unset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxy env | grep -i proxy确认输出为空后再去~/.bashrc里删掉对应的export。如果你确实需要代理得确保代理监听在 WSL 能访问的地址上而不是 Windows 的127.0.0.1。报错三Cannot read properties of undefined (reading choices)。这个报错说明请求发出去了但返回结构不是预期的 OpenAI 兼容格式。多半是 Base URL 填错打到了不兼容的端点。确认ANTHROPIC_BASE_URL是https://taotoken.net/api不要自己加/v1/chat/completions之类的后缀。Claude Code 会自己拼路径你加多了就错位。报错四OAuth 回调相关比如OAuth2 authentication failed或invalid_grant。如果你还在用 OAuth 登录流程这类错误通常是凭据缓存损坏。清掉缓存重来rm -rf ~/.claude/credentials rm -rf ~/.config/claude然后重新走登录。但更推荐直接切到 §3 的 API Key 配置从根上绕开 OAuth 回调。报错五reading choices伴随404。检查 Model ID 是否拼错。claude-sonnet-4-5和claude-sonnet-4.5是两回事以你账号里实际可用的为准。可以在控制台或模型列表页确认准确的 ID。排查时有个通用顺序先curl验通道再config list验配置最后--debug看实际请求。三步定位到具体层比盲目改配置快得多。如果所有本地检查都过了还是 401回到第一步看status.claude.com确认不是服务端问题。6. 稳定接入后的日常用法与 CTA配置跑通后日常使用就简单了。Claude Code 直接读你项目目录你可以让它解释代码、改 bug、写测试。因为走的是 API Key 通道不再依赖浏览器回调WSL 里开多少个终端都不会互相干扰。如果你长期在终端里做编码和 Agent 任务建议了解一下 Coding Plan路径是https://taotoken.net/coding-plan适合高频使用的场景。日常排障和接入文档都在https://taotoken.net/doc遇到新报错先去这里翻。需要生成或管理 Key 就去https://taotoken.net/api-keys模型对话验证在https://taotoken.net/models。最后留一个我踩过的坑WSL 重启后偶尔会重置网络导致之前的连接失效。如果某天突然又 401先别改配置执行一次curl -sS -o /dev/null -w %{http_code} https://taotoken.net/api返回 401 说明网络通、只是没带 Key那就是配置被覆盖了返回 000 或超时才是网络问题。这个判断能帮你少走很多弯路。