Claude Media
「OAuth token revoked」の対処 — Claude Codeの再ログイン手順

「OAuth token revoked」の対処 — Claude Codeの再ログイン手順

Claude Codeで「OAuth token revoked」「OAuth token has expired」が出たときの対処です。/loginで直らない場合の見分け方とCLAUDE_CODE_OAUTH_TOKENの挙動を扱います。

Claude Codeが「OAuth token revoked」または「OAuth token has expired」と表示したら、保存済みのログインをAPIが拒否した状態です。公式の対処は/loginでの再ログインです。ただしCLAUDE_CODE_OAUTH_TOKEN環境変数を使っていると、/loginしても新しいセッションで同じエラーに戻ります。最初の分かれ目は、どの認証情報が使われているかです。

表示された文言で原因を絞る

「認証が切れた」系のエラーは複数あり、同じ/loginでも原因が違います。Claude Codeが出す文言を、発生の仕組みごとに並べます。

表示何が起きたか
OAuth token revoked · Please run /login何が起きたかAPIが401を返した。トークンは全端末でのサインアウトか管理者によるアクセス削除で失効している
Please run /login · API Error: 401 OAuth token has expired ...何が起きたかAPIが401を返した。セッション中の自動更新が失敗している
Login expired · Please run /login何が起きたか更新に失敗してログインを消した後で、Claude Code自身がリクエストを送らずに止めている
Please run /login · API Error: 401 Invalid authentication credentials何が起きたか認証情報の形式は認識されたが、アカウントか組織が拒否された

上の2行は、APIが返した拒否をそのまま報告するものです。Login expiredは仕組みが違い、保存済みのリフレッシュトークンをOAuthサービスが拒否した時点でClaude Codeが認証情報を消し、以後のリクエストをAPIに届ける前にローカルで止めます。非対話モード(-p)とAgent SDKではFailed to authenticate: OAuth session expired and could not be refreshedと表示され、構造化エラーコードはauthentication_failedです。

最後のInvalid authentication credentialsは、トークン期限切れが原因ではありません。認証情報が最近失効した、組織が無効化された、アカウントが停止されたといった場合に返ります。認証元が保存済みログインなのか承認済みのANTHROPIC_API_KEYなのかで直し方が変わるため、先に/statusを実行します。API keyの行があり、使われていない旨の表示が付いていなければAPIキーが優先されているので、/loginでは置き換わりません。キーをConsoleでローテーションするか、unset ANTHROPIC_API_KEYで契約プランの認証に戻します。同じアカウントで同じ文言が繰り返し返るなら、アカウントか組織が有効でなくなっているため、組織の管理者にアクセスの復旧を依頼します。

/statusはログイン切れも先に教えてくれます。保存済みログインが有効な認証元で更新もできない状態のときだけ、Loginの行にExpired — log in againが出ます。リクエストが失敗する前に状態を知る手段になります。期限の3日前からは、起動時にYour login expires in 3 days · run /login to renewという警告も出ます。

症状から直すまでの順番

手順

表示から対処までの順番

  1. 1

    /statusで認証元を確認する

    Auth tokenの行がCLAUDE_CODE_OAUTH_TOKENなら、環境変数が使われています。API keyの行が有効なら、ANTHROPIC_API_KEYが優先されています。どちらも出ずLoginの行だけなら、保存済みのログインが認証元です。

  2. 2

    保存済みログインなら/loginを実行する

    ブラウザーの認証を完了します。

  3. 3

    環境変数なら値を作り直すか外す

    claude setup-tokenで新しいトークンを発行して環境変数を差し替え、Claude Codeを再起動します。ブラウザー認証を使えるなら、変数を外して/loginに切り替えます。

  4. 4

    直らないときは時刻とKeychainを見る

    システムクロックのずれと、macOSではKeychainの状態が原因になります。詳細は後の節で扱います。

/loginで再ログインする

ターミナルで/loginを実行し、ブラウザーの認証フローを完了します。

/login

ブラウザーが自動で開かないときは、ログインのプロンプトでcキーを押すと認証URLがクリップボードにコピーされます。手元のブラウザーへ貼り付けて認証します。WSL2・SSH・コンテナでは、認証後にブラウザーがコールバックへ戻れず、代わりにログインコードが表示されます。ターミナルのPaste code here if promptedのプロンプトへ貼り付ければ完了します。ログイン方式そのものの選び方はClaude Codeログイン方法3種の使い分けにまとめてあります。

Claude Code v2.1.285でclaude auth login --helpを実行すると、次のオプションが表示されました。

claude auth login --help
Usage: claude auth login [options]
 
Sign in to your Anthropic account
 
Options:
  --claudeai       Use Claude subscription (default)
  --console        Use Anthropic Console (API usage billing) instead of Claude
                   subscription
  --email <email>  Pre-populate email address on the login page
  -h, --help       Display help for command
  --sso            Force SSO login flow

--claudeaiが既定で、--consoleを付けるとAPI課金側のログインになります。アカウントの種別を取り違えて再ログインしているときは、このオプションで意図した方に合わせられます。同じclaude authにはstatusもあり、--textを付けると人が読める形式で、ログイン方式・組織・メールアドレスの3行が出ます。対話画面を開かずに認証状態を確かめたいときに使えます。

CLAUDE_CODE_OAUTH_TOKENを使っている場合は/loginだけでは戻らない

CI・ヘッドレス環境では、claude setup-tokenで発行した長期トークンをCLAUDE_CODE_OAUTH_TOKEN環境変数に入れて使うのが一般的です。この変数が設定されているセッションでは、401が返ってもClaude Codeは保存済みログインへ切り替えません。変数の値を送り続けます。

くらべる

OAuthトークンの2つの経路

/loginで作られる

保存済みのログイン

Pro・Max・Team・Enterpriseの契約プランで使う既定の認証です。認証元の優先順位は最も低く、7番目です。期限が切れると自動更新され、更新に失敗したときにLogin expiredが出ます。

setup-tokenで作られる

CLAUDE_CODE_OAUTH_TOKEN

有効期間は1年で、コマンドはトークンを表示するだけで保存しません。優先順位は5番目で、保存済みログインより先に読まれます。期限切れか失効すると、同じ401メッセージが出ます。

優先順位が上の環境変数が、下の/loginより先に読まれるのがつまずきの原因です。変数が設定されている状態で/loginを実行すると、そのセッションだけは新しいログインに切り替わります。しかし新しいセッションではまた変数が読み直されるので、シェルのプロファイルか設定ファイルのenvブロックから変数を消さない限り、同じ失効済みトークンでエラーになります。

対処は次のいずれかです。

  • claude setup-tokenで新しいトークンを発行し、環境変数を更新してからClaude Codeを再起動する
  • 環境変数をunsetし、/loginでブラウザー認証に切り替える

claude setup-tokenのヘルプはオプションを持たず、-h, --helpだけが表示されます。ブラウザー認証が使えないCI・ヘッドレス環境では、手元の端末でclaude setup-tokenを実行し、表示された値をGitHub ActionsのSecretsなどへ設定し直します。ローカル開発ならブラウザー認証に戻すほうが手順は少なくて済みます。

制約

長期トークンでできないこと

  • Remote Control

    CLAUDE_CODE_OAUTH_TOKENはモデルへのリクエストしか送れないため、Remote Controlのセッションを確立できません。

  • claude.aiコネクタ

    claude.aiのコネクタも取得できません。ローカルで設定したMCPサーバーは引き続き使えます。

  • --bareモード

    --bareを付けるとCLAUDE_CODE_OAUTH_TOKENは読まれません。スクリプトで--bareを使うなら、ANTHROPIC_API_KEYかapiKeyHelperで認証します。

v2.1.225より前のClaude Codeには、401の一時的な失敗のあとに、この変数の値を保存済みログインの短期アクセストークンへ置き換えてしまう挙動がありました。短期トークンが切れると再び401になり、ヘッドレスのセッションは再起動するまで壊れたままでした。v2.1.225以降はこの置き換えが起きません。

再発する場合に確認する3点

/loginをやり直しても同じエラーが繰り返される場合は、次を順に確認します。

システムクロックのずれ。トークンの検証は端末の時刻に依存するため、時刻がずれていると正しいトークンでも拒否されます。OSの時刻自動同期が有効か確認します。

macOSのKeychain。macOSの認証情報は暗号化されたKeychainに保存されます。Keychainが書き込みを拒否すると、Claude Codeは~/.claude/.credentials.jsonへ平文で保存し直します。SSH接続中でKeychainがロックされているときや、Keychainのパスワードがアカウントのパスワードとずれているときが典型です。claude doctorを実行すると、書き込めない場合はmacOS Keychain is not writableで始まる警告が出ます。手動で解除するコマンドは次のとおりです。

security unlock-keychain ~/Library/Keychains/login.keychain-db

実行後にもう一度claude doctorを実行し、警告が消えれば解決です。消えなければKeychain Accessアプリでloginキーチェーンのパスワードをアカウントのパスワードに合わせて再同期します。

Keychainが書き込めるようになれば、Claude Codeは次に認証情報を書くときに保存先をKeychainへ戻します。今すぐ戻したいときは/logoutのあとに/loginを実行します。ただしログアウトすると、保存済みのMCPサーバーのログインやプラグインの機密値を含む保存済みの認証情報がすべて消えるため、MCPは再認証になります。

LinuxとWindowsは最初からファイル(Windowsは%USERPROFILE%\.claude\.credentials.json)に認証情報を保存するので、この確認が要るのはmacOSだけです。CLAUDE_CONFIG_DIRを設定していると、ファイルもKeychainのエントリもそのディレクトリ単位になり、設定が違うセッションは別の認証情報を読みます。

並行セッションの競合。同じマシンの複数セッションは保存済みログインを共有し、更新は1プロセスずつ順番に行います。v2.1.211より前は、スリープ復帰後に資格情報を共有する複数セッションが一斉にログアウトし、再ログインを求められる不具合がありました。v2.1.211以降は解消されています。今のバージョンでも、更新中のプロセスが終了して更新ロックが残るとCould not refresh your login because another Claude Code process is refreshing itが出ます。このメッセージはログインが拒否されたという意味ではありません。少し待つか、ほかのClaude Codeのウィンドウを閉じるか、/loginで入り直します。

Remote Controlセッション中に出る関連エラー

Remote Controlは、保存済みのclaude.aiログインで更新する短期の認証情報で接続しています。ログインが受け付けられなくなると、Remote Control disconnected — に続けて原因が表示されます。ローカルのセッションは動き続け、Remote Controlだけが止まります。

  • Claude.ai login expired / Claude.ai login was rejected: 保存済みログイントークンが期限切れか失効で拒否された
  • OAuth token unavailable: 更新が必要になった時点で、保存済みトークンが存在しなかった
  • OAuth token refresh failed: 再接続中にclaude.aiがトークンを拒否し、更新しても新しいトークンが得られなかった
  • JWT refresh failed: no OAuth token: 更新に使う保存済みトークンが見つからなかった
  • Signed out of Claude: 別のターミナルの/logoutなどで、このマシンからサインアウトした

Claude.ai login expired、Claude.ai login was rejected、OAuth token unavailableの3文言は、v2.1.225で追加されました。

ログインサービスから応答がないだけの場合は、Remote Controlは動いたまま更新を再試行します。現在の認証情報が切れてもサービスが応答しなければ、そこで止まってOAuth token refresh failedと報告します。

対処はどれも/loginでの再サインインです。メッセージがrun /login to restore Remote Controlで終わるなら、サインインすればClaude Codeが自動で再接続します。それ以外の文言では、/loginのあとに/remote-controlを実行します。

エラーメッセージが出ないログインの往復

エラー文言ではなく、Authorize画面と再認証画面の間を無限に往復するループが起きている場合は、原因も対処も別です。Claude Codeでログインがループする問題で扱っています。ほかのエラーとあわせて典型的な失敗パターンを俯瞰したいときはClaude Codeでよくあるエラー10選も参考になります。

よくある質問

ANTHROPIC_API_KEYが設定されていると挙動は変わりますか

承認済みのANTHROPIC_API_KEYがあると、そちらが保存済みログインより優先され、/loginの結果は上書きされません。想定と違うアカウントで動いているときは、Claude Codeアカウント切り替えの優先順位の説明を確認してからunset ANTHROPIC_API_KEYを試すと切り分けやすくなります。非対話モード(-p)では、キーがあれば常にそちらが使われます。

この記事を共有:XはてブLinkedIn