Failed to authenticate. API Error: 401 OAuth access token is invalid.
OAuthトークンの値が拒否された状態。claude setup-token で発行し直すか、変数を外して /login する。
エラー文字列
Failed to authenticate. API Error: 401 OAuth access token is invalid.
⚠️ 標準エラーではなく標準出力に出ます。終了コードは 1 です。
claude -p の出力をそのまま使っていると、この文字列が回答として入ります。
何が起きているか
環境変数 CLAUDE_CODE_OAUTH_TOKEN に入っている値を、API が拒否しました。
⭐ 値は読まれています。 読まれたうえで、トークンとして通らなかった状態です。 表示を見れば、どの経路の認証で落ちたかが分かります。v2.1.283 で実測した対応表です。
| 渡したもの | 実際に出た表示 |
|---|---|
| 何も渡していない | Not logged in · Please run /login |
無効な ANTHROPIC_API_KEY |
Failed to authenticate. API Error: 401 API key is invalid. |
無効な CLAUDE_CODE_OAUTH_TOKEN |
Failed to authenticate. API Error: 401 OAuth access token is invalid. |
失敗する apiKeyHelper |
Your apiKeyHelper script is failing |
🔴 API キーがあると、トークンは使われない
ANTHROPIC_API_KEY と CLAUDE_CODE_OAUTH_TOKEN を両方置いて実行すると、
表示は 401 API key is invalid. になりました。API キーの方が使われています。
⚠️ つまり、この表示が出ているなら ANTHROPIC_API_KEY は設定されていません。
逆に、トークンを直したのに表示が API key is invalid に変わった場合は、どこかに API キーが残っています。
⚠️ claude auth status では見分けられない
無効なトークンを入れた状態でも、claude auth status は "loggedIn": true を返しました(終了コード 0)。
{
"loggedIn": true,
"authMethod": "oauth_token"
}
「トークンがあるか」を見ているだけで、有効かどうかは確かめていません。
CI の事前確認に auth status を使っても、このエラーは防げません。
直し方
1. 実際に入っている値を確認する
Windows(PowerShell)
if ($env:CLAUDE_CODE_OAUTH_TOKEN) {
"長さ: {0}" -f $env:CLAUDE_CODE_OAUTH_TOKEN.Length
"先頭: {0}" -f $env:CLAUDE_CODE_OAUTH_TOKEN.Substring(0, [Math]::Min(14, $env:CLAUDE_CODE_OAUTH_TOKEN.Length))
"前後の空白や改行: {0}" -f ($env:CLAUDE_CODE_OAUTH_TOKEN -ne $env:CLAUDE_CODE_OAUTH_TOKEN.Trim())
} else { "CLAUDE_CODE_OAUTH_TOKEN は設定されていません" }
macOS / Linux
printf '長さ: %s\n' "${#CLAUDE_CODE_OAUTH_TOKEN}"
printf '先頭: %.14s\n' "$CLAUDE_CODE_OAUTH_TOKEN"
⚠️ トークンの全体を画面やログに出さないこと。 長さと先頭数文字で足ります。
2. トークンを発行し直す
claude setup-token
v2.1.283 のヘルプでは「長期間使える認証トークンを発行する(Claude の契約が必要)」と説明されています。
⚠️ ブラウザでの認証を伴います。 CI の中では実行できません。手元の端末で発行し、 出てきた値を CI のシークレットに入れ直してください。
3. 手元では変数を外して /login を使う
手元の端末なら、トークンを環境変数で渡す必要はありません。
macOS / Linux
unset CLAUDE_CODE_OAUTH_TOKEN
claude
Windows(PowerShell)
Remove-Item Env:CLAUDE_CODE_OAUTH_TOKEN
claude
起動したら /login を実行します。
⭐ 変数を外して claude -p "hi" の表示が Not logged in · Please run /login に変われば、
原因はその変数だったと確定できます。
再発防止
- CI には API キーかトークンのどちらか一方だけを渡す。両方あると API キーが優先され、トークンを直しても効かない
claude auth statusを事前確認に使わない。有効かどうかは確かめていないclaude -pの終了コードを見る。この表示は標準出力に出るため、回答として受け取ってしまう