Claude Code のエラー

Failed to authenticate: OAuth session expired and could not be refreshed

結論

保存されたログインを更新できなかった状態。期限が残っていても出る。ログインし直すか、CIでは鍵で認証する。

確認した版 Claude Code v2.1.283
確認日 2026年9月28日
最終更新 2026年9月28日
根拠 実機で確認

エラー文字列

Claude Code
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 の終了コードを見る。この表示は標準出力に出る

この手順で直りませんでしたか?

環境を添えて報告いただければ、追加の原因を検証してこのページに反映します。

エラーを報告する