Skip to content

fix: 根据 token 类型选择正确的 Claude 认证环境变量#37

Open
lichengzhe wants to merge 1 commit intoSaladDay:mainfrom
lichengzhe:fix/claude-auth-env-key
Open

fix: 根据 token 类型选择正确的 Claude 认证环境变量#37
lichengzhe wants to merge 1 commit intoSaladDay:mainfrom
lichengzhe:fix/claude-auth-env-key

Conversation

@lichengzhe
Copy link
Contributor

问题 (Closes #32)

cc-switch 将所有 Claude API 凭证统一存为 ANTHROPIC_AUTH_TOKEN,但 Claude Code 对两种认证方式使用不同的 HTTP header

环境变量 HTTP Header 适用场景
ANTHROPIC_AUTH_TOKEN Authorization: Bearer xxx OAuth token (sk-ant-oat...)
ANTHROPIC_API_KEY x-api-key: xxx 标准 API key (sk-ant-api...)

当用户使用标准 API key 时,被错误地存为 ANTHROPIC_AUTH_TOKEN,Claude Code 将其作为 Bearer token 发送 → 服务端不认 → 401

验证过程

通过 strings 分析 Claude Code 二进制,确认了两种 env var 的处理逻辑:

// Claude Code 内部:分别读取,走不同 header
apiKey: EyT("ANTHROPIC_API_KEY") ?? null,
authToken: EyT("ANTHROPIC_AUTH_TOKEN") ?? null

// AUTH_TOKEN → Bearer header
function JW7(T, R) {
  let A = process.env.ANTHROPIC_AUTH_TOKEN || CWT(R);
  if (A) T.Authorization = `Bearer ${A}`
}

修复方案

新增两个 helper(services/provider/mod.rs

claude_auth_env_keys(token) → (primary_key, old_key)

  • sk-ant-oat...("ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_API_KEY")
  • 其他 → ("ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN")

get_claude_token_from_env(env) → Option<&str>

  • 统一读取逻辑,先查 AUTH_TOKEN 再查 API_KEY,兼容新旧数据

变更文件

写入端(3处) — 根据 token 前缀自动选择正确的 env var:

  • cli/tui/form.rs — TUI 表单提交
  • cli/commands/provider_input.rs — CLI 交互模式
  • deeplink/provider.rs — deeplink 导入

读取端(5处) — 统一使用 get_claude_token_from_env helper:

  • cli/tui/form.rs — 编辑时加载已有 provider
  • cli/tui/ui.rs — TUI 详情展示
  • cli/commands/provider.rs — CLI 展示
  • cli/interactive/provider.rs — 交互模式展示
  • services/provider/usage.rs — 用量检查
  • deeplink/provider.rs — deeplink 读取

向后兼容:已有数据库中存储的 ANTHROPIC_AUTH_TOKEN 仍可正常读取,无需迁移。

测试

全部 237 个测试通过,包括更新了 4 个受影响的断言。

问题:
cc-switch 将所有 Claude API 凭证统一存为 ANTHROPIC_AUTH_TOKEN,
但 Claude Code 对两种认证方式使用不同的 HTTP header:
- ANTHROPIC_AUTH_TOKEN → Authorization: Bearer(OAuth token)
- ANTHROPIC_API_KEY → x-api-key(标准 API key)

当用户使用标准 API key(sk-ant-api...)时,被错误地存为
ANTHROPIC_AUTH_TOKEN,Claude Code 会将其作为 Bearer token 发送,
导致服务端返回 401。

修复:
- 新增 claude_auth_env_keys() 根据 token 前缀自动选择 env var:
  sk-ant-oat... → ANTHROPIC_AUTH_TOKEN(OAuth)
  其他 → ANTHROPIC_API_KEY(标准 API key)
- 新增 get_claude_token_from_env() 统一读取逻辑,兼容两种 key
- 更新所有写入端(TUI form / CLI interactive / deeplink import)
- 更新所有读取端使用统一 helper,兼容已有数据

Closes SaladDay#32

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4.7.2 claude配置问题,切换api后报错401,json应该是ANTHROPIC_API_KEY而不是ANTHROPIC_API_TOKEN

1 participant