资讯中心

【Claude】Invalid API key 错误:密钥格式校验与环境变量优先级问题 bug报错已解决

📅 2026/6/27 1:58:39
【Claude】Invalid API key 错误:密钥格式校验与环境变量优先级问题 bug报错已解决
【Claude】Invalid API key 错误密钥格式校验与环境变量优先级问题 bug报错已解决关键词: Claude Code、Invalid API key、API 密钥格式、密钥校验、环境变量优先级、ANTHROPIC_API_KEY、密钥格式、sk-ant、密钥验证、格式检查、环境变量冲突、凭证优先级一、问题描述当密钥格式不对Invalid API key 错误中有一类特殊原因是密钥格式问题。Anthropic API Key 有特定的格式规范任何不符合规范的 Key 都会被直接拒绝。此外当环境中存在多个凭证源时环境变量的优先级可能导致正确的 Key 被覆盖的困惑。本文聚焦于密钥格式校验和环境变量优先级这两个容易被忽视但经常导致 Invalid API key 的根因。1.1 典型报错场景与错误信息场景一密钥格式错误import anthropic # 使用错误的 Key 格式 client anthropic.Anthropic(api_keymy-api-key-123) # 不是有效的 Anthropic Key response client.messages.create(...) # 错误Invalid API key: my-api-key-123场景二环境变量优先级冲突# 在 ~/.zshrc 中设置了旧 Key export ANTHROPIC_API_KEYsk-ant-api03-旧Key-已撤销 # 在 ~/.bashrc 中又设置了新 Key export ANTHROPIC_API_KEYsk-ant-api03-新Key-有效 # 实际生效的是 ~/.zshrc 中的旧 Key因为 zsh 先加载 $ echo $ANTHROPIC_API_KEY sk-ant-api03-旧Key-已撤销场景三Key 包含额外空格# 复制 Key 时带入了空格或换行 export ANTHROPIC_API_KEY sk-ant-api03-xxx # 前后有空格 # 或 export ANTHROPIC_API_KEYsk-ant-api03-xxx\n # 末尾有换行场景四使用其他服务的 Key# 混淆了 OpenAI 和 Anthropic 的 Key client anthropic.Anthropic(api_keysk-openai-xxx) # 这是 OpenAI 的 Key # 错误Invalid API key二、根因分析密钥格式与优先级2.1 Anthropic API Key 的格式规范标准格式sk-ant-api03-{base58-encoded-data} 示例sk-ant-api03-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 需知 - 必须以 sk-ant 开头 - 包含版本标识api03、api04 等 - 长度通常在 100-120 字符之间 - 只能包含字母、数字和连字符 - 不包含空格、换行或特殊字符2.2 常见格式错误错误类型示例问题前缀错误sk-openai-xxx这是 OpenAI 的 Key缺少前缀api03-xxx缺少sk-ant-前缀包含空格sk-ant-api03-xxx末尾有空格包含换行sk-ant-api03-xxx\n包含换行符截断sk-ant-api03-Key 不完整过期格式sk-ant-api02-xxx使用已弃用的版本Admin Key 误用sk-ant-admin13-xxx管理 Key 不能用于普通 API2.3 环境变量优先级规则环境变量加载优先级从高到低 1. 当前 shell 中 export 的变量 2. 项目级 .env 文件通过 direnv 加载 3. 用户级 shell 配置文件~/.zshrc, ~/.bashrc 4. 系统级环境变量/etc/profile, /etc/environment 5. 父进程继承的变量 需知 - 后加载的会覆盖先加载的 - 但同一 shell 中先 export 的优先级高于后 export 的三、实际操练密钥格式校验与修复3.1 第一步密钥格式验证器#!/usr/bin/env python3 # api_key_validator.py import re import os def validate_anthropic_api_key(api_key): 验证 Anthropic API Key 的格式 返回: (is_valid, error_message) if not api_key: return False, API Key 为空 # 去除首尾空白 api_key api_key.strip() # 检查长度 if len(api_key) 50: return False, fAPI Key 太短 ({len(api_key)} 字符)正常应在 100 字符 # 检查前缀 if not api_key.startswith(sk-ant): if api_key.startswith(sk-): return False, API Key 前缀错误可能是其他服务的 Key如 OpenAI return False, API Key 必须以 sk-ant 开头 # 检查版本标识 version_match re.match(r^sk-ant-(api\d)-, api_key) if not version_match: return False, API Key 格式错误缺少版本标识如 api03 # 检查非法字符 if not re.match(r^[a-zA-Z0-9\-]$, api_key): invalid_chars set(re.findall(r[^a-zA-Z0-9\-], api_key)) return False, fAPI Key 包含非法字符: {invalid_chars} # 检查是否包含换行 if \n in api_key or \r in api_key: return False, API Key 包含换行符 # 检查是否包含空格 if in api_key: return False, API Key 包含空格 return True, 格式有效 def check_environment_key(): 检查环境变量中的 API Key api_key os.environ.get(ANTHROPIC_API_KEY, ) print(f环境变量 ANTHROPIC_API_KEY:) print(f 长度: {len(api_key)} 字符) print(f 前 20 字符: {api_key[:20] if api_key else 未设置}) print(f 后 5 字符: {api_key[-5:] if api_key else 未设置}) is_valid, msg validate_anthropic_api_key(api_key) print(f 验证结果: {msg}) return is_valid, api_key # 使用 if __name__ __main__: # 测试环境变量中的 Key check_environment_key() # 测试一些示例 Key test_keys [ sk-ant-api03-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, sk-openai-xxxx, api03-xxxx, sk-ant-api03-xxx , sk-ant-api03-xxx\n, ] print(\n 测试密钥 ) for key in test_keys: valid, msg validate_anthropic_api_key(key) status ✅ if valid else ❌ print(f{status} {key[:30]:30} → {msg})3.2 第二步环境变量优先级排查#!/bin/bash # env_priority_check.sh echo 环境变量优先级排查 # 1. 检查当前环境变量 echo [1] 当前 shell 环境变量: echo ANTHROPIC_API_KEY${ANTHROPIC_API_KEY:0:20}... # 2. 检查 shell 配置文件 echo echo [2] Shell 配置文件中的设置: for file in ~/.zshrc ~/.bashrc ~/.bash_profile ~/.profile ~/.zshenv; do if [ -f $file ]; then match$(grep ANTHROPIC_API_KEY $file 2/dev/null) if [ -n $match ]; then echo $file: echo $match fi fi done # 3. 检查项目级 .env echo echo [3] 项目级 .env 文件: for f in .env .env.local .envrc; do if [ -f $f ]; then echo $f: grep ANTHROPIC_API_KEY $f 2/dev/null | sed s/^/ / fi done # 4. 检查系统环境变量macOS echo echo [4] 系统环境变量如适用: launchctl getenv ANTHROPIC_API_KEY 2/dev/null || echo 未设置 # 5. 检查所有 ANTHROPIC 相关变量 echo echo [5] 所有 ANTHROPIC 环境变量: env | grep ANTHROPIC | sed s/^/ /3.3 第三步修复环境变量冲突# 方案 A统一清理并设置正确的 Key unset ANTHROPIC_API_KEY unset ANTHROPIC_AUTH_TOKEN # 从所有 shell 配置中移除旧 Key for file in ~/.zshrc ~/.bashrc ~/.bash_profile ~/.profile; do if [ -f $file ]; then sed -i.bak /ANTHROPIC_API_KEY/d $file 2/dev/null sed -i.bak /ANTHROPIC_AUTH_TOKEN/d $file 2/dev/null fi done # 重新设置正确的 Key export ANTHROPIC_API_KEYsk-ant-api03-你的正确Key # 添加到 ~/.zshrc或其他使用的 shell 配置 echo export ANTHROPIC_API_KEYsk-ant-api03-你的正确Key ~/.zshrc # 重新加载配置 source ~/.zshrc # 验证 echo $ANTHROPIC_API_KEY3.4 第四步验证 Key 有效性#!/usr/bin/env python3 # verify_key.py import anthropic import os def verify_api_key(api_keyNone): 验证 API Key 是否有效 if api_key is None: api_key os.environ.get(ANTHROPIC_API_KEY) if not api_key: print(❌ 未提供 API Key) return False print(f测试 Key: {api_key[:20]}...) try: client anthropic.Anthropic(api_keyapi_key) response client.messages.create( modelclaude-haiku-3-20250307, max_tokens10, messages[{role: user, content: Say OK}] ) print(✅ Key 有效) return True except anthropic.AuthenticationError as e: print(f❌ Key 无效: {e}) return False except Exception as e: print(f⚠️ 其他错误: {e}) return False # 使用 verify_api_key()四、验证与回归测试#!/bin/bash # key_validation_test.sh echo API Key 验证回归测试 # 1. 格式检查 echo -n [1/4] 格式检查 ... if [[ $ANTHROPIC_API_KEY sk-ant-api03-* ]] [ ${#ANTHROPIC_API_KEY} -gt 50 ]; then echo ✅ else echo ❌ 格式错误 fi # 2. 无空格检查 echo -n [2/4] 无空格检查 ... if [[ $ANTHROPIC_API_KEY ! * * ]]; then echo ✅ else echo ❌ 包含空格 fi # 3. 环境变量唯一性 echo -n [3/4] 环境变量唯一性 ... CONFLICTS0 for file in ~/.zshrc ~/.bashrc ~/.bash_profile; do if [ -f $file ] grep -q ANTHROPIC_API_KEY $file 2/dev/null; then CONFLICTS$((CONFLICTS 1)) fi done if [ $CONFLICTS -le 1 ]; then echo ✅ else echo ⚠️ $CONFLICTS 个配置文件包含 Key fi # 4. API 连通性测试 echo -n [4/4] API 连通性 ... if python3 -c import anthropic; client anthropic.Anthropic(); client.messages.create(modelclaude-haiku-3-20250307, max_tokens10, messages[{role:user,content:hi}]) 2/dev/null; then echo ✅ else echo ❌ fi五、总结与最佳实践5.1 核心要点格式校验Key 必须以sk-ant开头长度 100 字符去除空白复制 Key 时去除首尾空格和换行环境变量唯一性确保只有一个地方设置 ANTHROPIC_API_KEY验证有效性使用脚本验证 Key 是否真的能调用 API区分服务不要混淆 OpenAI、Anthropic 等不同服务的 Key5.2 最佳实践场景做法复制 Key仔细核对去除首尾空白存储 Key使用 .env 文件或密钥管理工具多环境切换使用 direnv 按项目加载不同 Key验证 Key使用脚本验证格式和有效性排查冲突检查所有 shell 配置和 .env 文件