Failed to authenticate: OAuth session expired and could not be refreshed
保存されたログインを更新できなかった状態。期限が残っていても出る。ログインし直すか、CIでは鍵で認証する。
エラー文字列
Failed to authenticate: OAuth session expired and could not be refreshed
⚠️ 標準出力に出ます。終了コードは 1 です。 claude -p の出力を回答として扱っていると、この文字列が入ります。
何が起きているか
/login で保存したログイン(Claude の契約、または Console)を、Claude Code が更新しようとして失敗しました。
更新できないので、API には送らずにここで止めています。
| 実行のしかた | 出る表示 |
|---|---|
claude -p(非対話) |
Failed to authenticate: OAuth session expired and could not be refreshed |
| 対話モード | Login expired · Please run /login(公式の説明による) |
🔴 期限が残っていても出る
v2.1.283 で、保存されたログインの中身だけを変えて実測しました(トークンはすべて無効な値)。
| 保存されていたログイン | 結果 |
|---|---|
| 有効期限が過ぎたもの | この表示 |
| 有効期限がまだ残っているもの | この表示(同じ) |
⭐ 「expired(期限切れ)」と書いてあっても、時間切れとは限りません。 取り消された・別の端末でログインし直した、 などサーバーに拒まれたログインでも同じ表示になります。時計を疑う前に、ログインし直してください。
🔴 API キーがあると、この表示は出ない
同じ期限切れのログインを置いたまま ANTHROPIC_API_KEY も設定すると、表示は
401 API key is invalid.(鍵が無効な場合)に変わりました。
API キーが保存されたログインより優先されます。
⚠️ つまり この表示が出ているなら、API キーは環境にありません。 使われているのは保存されたログインです。
⚠️ claude auth status では気づけない
期限切れのログインが保存された状態で claude auth status を実行すると、"loggedIn": true が返りました(終了コード 0)。
{
"loggedIn": true,
"authMethod": "claude.ai",
"subscriptionType": "pro"
}
保存されているかを見ているだけで、更新できるかは確かめていません。
直し方
1. ログインし直す
対話モードなら、起動して /login を実行します。コマンドから行う場合は次のとおりです。
claude auth logout
claude auth login
claude auth logout は、期限切れのログインが残った状態でも Successfully logged out from your Anthropic account. で終わりました。
claude auth login の選択肢(v2.1.283 のヘルプ):
| オプション | 用途 |
|---|---|
--claudeai |
Claude の契約でログインする(既定) |
--console |
Console(API の従量課金)でログインする |
--sso |
SSO でログインする |
⚠️ ブラウザでの認証を伴います。 CI や SSH 先のように、ブラウザを開けない場所では完了できません。
2. CI・スクリプトでは保存されたログインを使わない
保存されたログインは更新が必要で、失敗するとこの表示で止まります。自動で動かすものは、更新の要らない方法で認証してください。
| 方法 | ページ |
|---|---|
ANTHROPIC_API_KEY |
401 API key is invalid |
CLAUDE_CODE_OAUTH_TOKEN(claude setup-token で発行) |
401 OAuth access token is invalid |
3. 直ったか確かめる
claude -p "hi"; echo "exit=$?"
Windows(PowerShell)
claude -p "hi"; "exit=$LASTEXITCODE"
⭐ 表示が Not logged in · Please run /login に変わった場合は、ログアウトまでは済んでいて、まだログインしていない状態です。
再発防止
- 自動で動かすものに
/loginのログインを使わない。 API キーかclaude setup-tokenのトークンにする claude auth statusのloggedIn: trueを「使える」と読まない。更新できるかは確かめていないclaude -pの終了コードを見る。この表示は標準出力に出る