Claude Code で Not logged in · Please run /login や Login expired · Please run /login が出たときの見分け方と直し方です。結論から言うと、ほとんどは /login をやり直せば直ります。直らない、あるいは何度も出る場合は、環境変数に古いトークンが残っているか、macOS のキーチェーンに書き込めていないか、システム時計がずれているかのどれかを疑います。
確認環境は Claude Code 2.1.316、macOS 26.6.2、2026-11-03 です。
症状
次のどれかが表示され、モデルへの送信が止まります。
Not logged in · Please run /login
Login expired · Please run /login
OAuth token revoked · Please run /login
Please run /login · API Error: 401 OAuth token has expired ...
claude -p や Agent SDK では、次のような文言になります。
Failed to authenticate: OAuth token revoked. Please log in again or contact your administrator.
Failed to authenticate. API Error: 401 OAuth token has expired ...
Failed to authenticate: OAuth session expired and could not be refreshed
結論
- 4 つとも対処の入口は同じで、Claude Code のプロンプトで
/loginを実行します。 - ただし意味は違います。「保存してあるログインがそもそも無い」「更新に失敗して Claude Code 自身が消した」「API に拒否された」の 3 通りで、
/statusを見ると今どの状態かが分かります。 -
/loginしても戻される、何度も聞かれる場合は、下の「直らないとき」の 3 点を順に確認します。
4 つの違い
公式の Error reference では、次のように分けられています。
Not logged in は、このセッションで使える認証情報が 1 つも無い状態です。初回、ログアウト後、環境変数で認証するつもりが export されていなかった場合などです。
Login expired は、Claude Code が保存済みの claude.ai ログインを更新しようとして、OAuth サービスにリフレッシュトークンを拒否され、保存していた認証情報を消した状態です。この表示のときは API にリクエストを送っておらず、Claude Code が手元で止めています。公式は「再試行しても同じメッセージが出る」と書いています。
OAuth token revoked と OAuth token has expired は、API に実際にリクエストを送って返ってきた拒否です。公式の説明では、revoked は「どこかでサインアウトした、または管理者がアクセスを外した」、expired は「セッション中の自動更新に失敗した」状態を指します。
つまり、Login expired は Claude Code が自分で止めたもの、OAuth token revoked / has expired は API に断られたもの、という違いです。
issue での報告では、この系統の issue は多く、タイトルに該当する文言を含むものだけで数十件、本文で Please run /login に触れるものは 340 件超あります。並列エージェントを動かしたときや、Desktop アプリと CLI を併用したときに、トークンが互いに無効化し合う例も報告されています。
手元で確かめたこと
サーバ側でトークンを失効させる状況は手元から安全に作れないため、Login expired と OAuth token revoked の再現はしていません。代わりに、「認証情報が無い」状態を、空の設定ディレクトリで作って確かめました。普段の ~/.claude には触れず、CLAUDE_CONFIG_DIR で空のディレクトリを指定しています。
mkdir empty
CLAUDE_CONFIG_DIR=./empty claude auth status | grep -E 'loggedIn|authMethod'
CLAUDE_CONFIG_DIR=./empty claude -p hi
claude auth status は "loggedIn": false と "authMethod": "none" を返し、claude -p hi は Not logged in · Please run /login を出して終了コード 1 で終わりました。認証情報が無ければ、リクエストを送る前に止まります。
もう 1 つ、現行版の実行ファイルに、ここで挙げた文言の断片が入っていることも確認しました。· の前後が別々の文字列として持たれているため、断片ごとに数えています。
B="$(readlink -f "$(which claude)")"
grep -a -c -F "Login expired" "$B"
grep -a -c -F "OAuth token revoked" "$B"
grep -a -c -F "Please run /login" "$B"
私の環境の出力は次のとおりです。数字は、その文字列が実行ファイル内に見つかった回数です。
2
3
16
すべて 1 以上なので、現行版に含まれています。
直し方
1. まず /status で、いま何で認証しているかを見る
Claude Code のプロンプトで実行します。
/status
公式によると、保存済みログインが更新できなくなっているときは、Login の行に Expired — log in again と出ます。この行は、保存ログインが今使われている認証情報のときだけ表示されます。API キーや CLAUDE_CODE_OAUTH_TOKEN で認証しているセッションには出ません。
2. /login をやり直す
/login
サブスクリプション(Pro / Max など)か Console アカウントかを選び、ブラウザで認可します。公式は、同じ設定ディレクトリを使う別の Claude Code ウィンドウで claude.ai ログインをやり直した場合、Not logged in と出ている対話セッションは再起動しなくても、そのログインを自動で使い始めると書いています(macOS の v2.1.286 より前は、そのセッションの再起動が必要でした)。
3. 直らなければ /logout してから /login
/logout
そのあと /login します。プラン変更の直後に Claude Opus is not available with the Claude Pro plan のように出る場合にも、公式は同じ手順を案内しています。保存されたトークンはログイン時点のプランを反映するためです。
なお、/logout は保存済みの認証情報をすべて消します。公式によると、保存済みの MCP サーバのログインやプラグインの機密値も含まれるため、後で再認可や再入力が必要になります。
4. 自動実行(CI、claude -p、Agent SDK)の場合
対話ログインができない環境では、/login は使えません。公式は次のどちらかを案内しています。
-
ANTHROPIC_API_KEYで認証する -
claude setup-tokenで長期トークンを作り、CLAUDE_CODE_OAUTH_TOKENに設定する
保存済みログインを使う -p コマンドの場合は、同じ環境で一度 claude を起動して /login を済ませてから、コマンドを実行し直します。
直らないとき
環境変数に古い認証情報が残っていないか
/login で保存したログインより、環境変数のほうが優先されます。次で確認します。
env | grep -E 'ANTHROPIC|CLAUDE_CODE_OAUTH'
CLAUDE_CODE_OAUTH_TOKEN を設定している場合、公式によると、401 で失敗しても Claude Code は設定した値を送り続け、保存済みログインのトークンには切り替えません。値は /status の Auth token の行に CLAUDE_CODE_OAUTH_TOKEN と出ます。claude setup-token で作り直すか、変数を外して /login します。
unset CLAUDE_CODE_OAUTH_TOKEN
issue での報告でも、古い CLAUDE_CODE_OAUTH_TOKEN が残っていて、ログインしても元のエラーに戻されるループが、変数を unset して直った例があります(issue #22685)。
ANTHROPIC_API_KEY が残っている場合は、別の記事にまとめています。
macOS のキーチェーンに書き込めていないか
公式の Troubleshooting によると、macOS では認証情報をログインキーチェーンに保存します。SSH 先でキーチェーンがロックされている、あるいはキーチェーンのパスワードがアカウントのパスワードと食い違っている場合は、書き込みが拒否され、平文の ~/.claude/.credentials.json に保存されます。この状態だと、ログインが続かないことがあります。
claude doctor
レポートに macOS Keychain is not writable で始まる警告が出ていれば、キーチェーンが原因です。警告が無ければ、この手順は飛ばして構いません。警告が出た場合は、次でロックを解除します(パスワードを聞かれます)。
security unlock-keychain ~/Library/Keychains/login.keychain-db
解除しても警告が消えない場合は、Keychain Access を開き、login キーチェーンを選んで「編集 > キーチェーン "login" のパスワードを変更」で、アカウントのパスワードと揃えます。そのあと claude doctor で警告が消えたことを確かめ、/logout、/login の順に実行します。
システム時計がずれていないか
公式は「頻繁に再ログインを求められるなら、システム時計が正確か確認してください。トークンの検証は正しいタイムスタンプに依存します」と書いています。macOS なら、システム設定の「日付と時刻」で、時刻を自動で設定する状態になっているかを確認します。
複数のウィンドウを開いている場合
公式によると、同じマシンの並列セッションは保存済みログインを共有し、同時に更新しないよう調整しています。v2.1.211 より前は、スリープからの復帰で 2 つのセッションが同じトークンで更新をかけ、保存済みログインが失効して、開いている全セッションが一斉に再ログインを求められることがありました。古い版を使っているなら、更新します。
同じ原因で出る別のメッセージ
Please run /login · API Error: 401 Invalid authentication credentials は、期限切れではありません。公式によると、認証情報の形式は正しいが、アカウントや組織の側で拒否されている状態です。/status で今使われている認証情報を確かめ、API キーなら作り直すか unset、ログインなら /login します。同じアカウントで繰り返す場合は、組織の管理者に確認します。
Invalid API key · Fix external API key は、外部から渡した ANTHROPIC_API_KEY が無効なときの表示です。
Couldn't save your login. If your Mac's keychain is locked, unlock it and log in again. は、ログインは完了したがキーチェーンに保存できなかった場合です。対処は上のキーチェーンの節と同じです。
Claude Code で出るほかの英文エラーと、それぞれの対処は、早見表にまとめています。
参考
- 公式 Error reference(Not logged in): https://code.claude.com/docs/en/errors#not-logged-in
- 公式 Error reference(OAuth token revoked or expired): https://code.claude.com/docs/en/errors#oauth-token-revoked-or-expired
- 公式 Error reference(Login expired): https://code.claude.com/docs/en/errors#login-expired
- 公式 Error reference(API Error: 401 Invalid authentication credentials): https://code.claude.com/docs/en/errors#api-error-401-invalid-authentication-credentials
- 公式 Troubleshooting(Not logged in or token expired): https://code.claude.com/docs/en/troubleshoot-install#not-logged-in-or-token-expired
- issue #12447(OAuth token has expired): https://github.com/anthropics/claude-code/issues/12447
- issue #81937: https://github.com/anthropics/claude-code/issues/81937
- issue #22685(古い CLAUDE_CODE_OAUTH_TOKEN でループ): https://github.com/anthropics/claude-code/issues/22685
