「Login expired · Please run /login」は、Claude Codeが保存していたログインを自動で更新しようとして断られ、保存済みの資格情報を消したことを知らせる表示です。この状態の指示はAPIに送られず、手元で止まります。/loginで入り直せば直り、そのまま再試行を繰り返しても表示は変わりません。

Login expired · Please run /login

非対話モード(claude -p)とAgent SDKでは、同じ状態が次の文言で表示されます(構造化されたエラーコードはauthentication_failed)。

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

最初に見るのは、表示の文言

「/login」を求める表示は、1つではない

Login expired · Please run /login
保存ログインの更新が拒否され、資格情報は消去済み
/loginで入り直す
指示はAPIに届いていない
Not logged in · Please run /login
このセッションで使える資格情報がそもそも無い
違いを確認する
環境変数の読み込み漏れも疑う
OAuth token revoked/OAuth token has expired
送ったリクエストをAPIが拒否した
/login、戻るなら/logoutから
送信後の拒否という点が違う
Your account is on hold…
ログインではなくアカウント自体の保留
→ 表示のリンクで詳細を確認
入り直しても消えない
公式エラーリファレンスの分類をもとに、表示の文言から確認先を選ぶための図です。

1. Login expiredは、何が期限切れになったのか

Claude Code公式のエラーリファレンスによると、この表示が出るまでの流れは次のとおりです。期限が切れたのは、/loginで手元に保存したclaude.aiまたはClaude Consoleのログイン(OAuthの資格情報)です。

更新に失敗した時点で、保存済みの資格情報は消えている

① 保存されたログイン

/loginで保存した、claude.aiまたはClaude Consoleのログイン

② 自動で更新を試みる

Claude Codeが、保存済みのリフレッシュトークンで更新を依頼する

③ 拒否され、消去する

OAuthの認証サービスが拒否し、Claude Codeが保存済みの資格情報を消す

④ 送信前に止まる

以後の指示は手元で止まり、Login expiredになる。新しい資格情報を作れるのは/loginだけ

出典:Claude Code公式エラーリファレンス「Login expired」の説明を図にしたもの。

ポイントは④です。Claude Codeは資格情報をすでに消しているので、リクエストをAPIへ送りません。何度送り直しても同じ表示が出るのはこのためで、公式も「サインインせずに再試行すると、毎回同じメッセージになる」と書いています。公式の説明は「更新が拒否された」という事実までで、拒否された理由の内訳は示されていません。ただし、原因がログインの古さではなくアカウント自体の停止だった場合は、別の表示「Your account is on hold」になると明記されています。

v2.1.206から、この表示になった

公式エラーリファレンスによると、v2.1.206より前のClaude Codeは、ログインを更新できなくなっても、環境に残っていた資格情報でそのままリクエストを送っていました。その結果、どのモデルを選んでも「There's an issue with the selected model」や401エラーになり、サインインを促す表示は出ませんでした。公式CHANGELOGのv2.1.206の項にも「期限切れのログインが、/loginを促す代わりに誤解を招くモデルエラーで失敗していた問題を修正」とあります(npmでの公開は2026年7月9日・UTC)。古い版を使っていて、すべてのモデルでモデルエラーが出るなら、まず/loginを試してください。

この表示が出ない認証方法

APIキー(ANTHROPIC_API_KEY)、claude setup-tokenで作る長期トークン(CLAUDE_CODE_OAUTH_TOKEN)、Amazon Bedrockなどのクラウド事業者で認証しているセッションは、保存ログインを使わないため、この表示は出ません。逆に言えば、Login expiredが出たセッションでは保存ログインが有効な資格情報として使われていました。

3日前に予告が出る

公式の認証ドキュメントによると、v2.1.203以降は、保存ログインの期限まで3日を切ると起動時に次の警告が出ます(v2.1.217より前は5日前)。警告は情報表示で、期限が来るまで認証は使えます。

Your login expires in 3 days · run /login to renew

早めの更新が効くのは、無人で動かしているセッションです。agent viewのバックグラウンドセッションRemote Controlのセッションがログインの期限をまたぐと、資格情報が切れた時点で進まなくなり、サインインし直すまで回復しません。

2. Not logged in・OAuth token expiredとの違い

どれも最後に/loginを求めますが、起きていることと、リクエストがAPIに届いたかどうかが違います。公式エラーリファレンスの説明を並べると次のとおりです。

表示起きていることAPIへの送信直し方
Login expired · Please run /login保存ログインの更新が拒否され、資格情報を消去済み送られない(手元で停止)/login
Not logged in · Please run /loginこのセッションで使える資格情報が無い/login、または意図した環境変数が読まれているか確認
OAuth token revoked · Please run /login…401 OAuth token has expired…送ったリクエストをAPIが拒否(全端末からのサインアウトや管理者による削除、セッション中の自動更新の失敗)送られて401/login。同じセッションで戻るなら/logout/login
Please run /login · API Error: 401 Invalid authentication credentials資格情報の形式は通ったが、アカウントや組織の側で拒否送られて401/statusで有効な資格情報を確認してから対処
Your account is on hold…アカウントの保留(v2.1.235より前はLogin expiredとして表示)表示のリンクで詳細の確認や異議申し立て
Remote Control disconnected — Claude.ai login expired — …Remote Controlの接続だけが止まった。手元のセッションは続く/login。表示によっては続けて/remote-control

Not logged inは「資格情報が最初から無い」、Login expiredは「あったが更新できずに消された」と覚えると区別できます。Not logged inでは、使うつもりだったANTHROPIC_API_KEYが起動したシェルで読み込まれていないこともあります。Not logged inの原因と、APIキーの環境変数がサブスクリプションのログインより優先される仕組みは、Claude Codeの認証・ログインエラー(Not logged in/Invalid API key)の記事で解説しています。

OAuth token has expiredとの違いは、APIに送った後か前かです。公式は「失敗した更新のあとで保存ログインがすでに消されている場合は、代わりにLogin expiredが表示される」と説明しています。名前の似たAnthropic profile login expiredは、ANTHROPIC_PROFILEなどで選ぶAnthropicの資格情報プロファイルを使っているときだけの表示で、claude.aiのログインを使うセッションには出ません。

3. /loginで入り直す手順

この表示が出たリクエスト自体はAPIに届いていません。ただし、ターンの途中で出た場合は、それより前のファイル編集やコマンドが済んでいることがあり、同じ指示をそのまま送ると二重に実行されるおそれがあります。送り直す前に、どこまで進んでいたかを確認してください。

01

期限切れになったアカウントを確かめる

入力欄で/statusを開きます。公式ドキュメントによると、v2.1.210以降はLoginの行にExpired — log in againと表示され、期限切れのログインに保存されていた組織とメールも出ます。この行は、保存ログインが有効な資格情報になっているときだけ表示されます。複数のアカウントを使い分けている場合は、ここで入り直す先を控えます。

02

/loginを実行して、同じアカウントでサインインする

ブラウザが開くので、サブスクリプションならclaude.aiのアカウント、API課金ならClaude Consoleのアカウントでサインインします。ブラウザが開かなければcを押してURLをコピーし、手元のブラウザに貼ります。WSL2・SSH・コンテナでは、サインイン後にブラウザがログインコードを表示することがあります。その場合は端末のPaste code here if promptedに貼り付けます。Login successfulと出たらEnterで戻ります。

03

コードの貼り付けが効かないときは、シェルから入る

入力欄への貼り付けが届かない端末では、Windows Terminalの右クリックやShift+Insertなど別の貼り付け方法を試します。それでもだめなら、シェルでclaude auth loginを実行します。このコマンドは貼り付けたコードを標準入力から読むため、ネイティブのWindowsでも使えると公式が案内しています。

04

短い指示で応答を確かめてから、作業に戻る

元の大きな指示をすぐに送らず、ファイル操作を伴わない短い確認を1回送ります。応答が返ったら、控えておいた指示を、進捗を確認したうえで送り直します。

# Claude Codeの入力欄で
/status
/login

# 入力欄への貼り付けが効かないとき(シェルで実行)
claude auth login

claude -pやCIで出たとき

非対話モードではブラウザでのサインインができません。公式の手順は、同じ環境で一度claudeを対話モードで起動し、/loginを済ませてから、元のコマンドを再実行することです。対話でサインインできない自動化では、ConsoleのAPIキー(ANTHROPIC_API_KEY、API利用料として課金)か、claude setup-tokenで作る長期トークンを使います。

claude setup-token
# ブラウザで承認すると、端末にトークンが表示される(どこにも保存されない)
export CLAUDE_CODE_OAUTH_TOKEN=表示されたトークン

公式の認証ドキュメントによると、このトークンは有効期間1年で、Pro・Max・Team・Enterpriseのいずれかのプランが必要です。できるのはモデルへのリクエストだけで、Remote Controlやclaude.aiのコネクタには使えません。--bareを付けた実行ではこの変数が読まれないので、APIキーかapiKeyHelperを使います。なお、このトークン自体が期限切れや無効になったときは、Login expiredではなくOAuth token revoked/expiredの表示になります。

サインイン自体が失敗するとき

公式のトラブルシューティングは、原因が分からないときのリセット手順として/logout→Claude Codeを閉じる→claudeで起動し直してサインインを挙げています。/logoutは初回起動時の設定状態も初期化するので、次の起動ではログインと初期設定をやり直します。保存された資格情報はすべて消え、MCPサーバーのログインやプラグインの秘密の値も入れ直しになります。OAuth error: Invalid codeと出た場合は、ログインコードの期限切れかコピー時の欠けが原因なので、ブラウザが開いたらすぐに操作を完了し、URLはcで丸ごとコピーします。

4. 直ったかを確かめる

エラーが1回出なかっただけで完了とせず、次の3つで確かめます。

/statusの表示

Login行のExpired — log in againが消え、組織とメールが意図したアカウントになっているか。ログインとAPIキーの両方があるときは、使われていない側に印が付く

claude auth statusの終了コード

公式のCLIリファレンスでは、ログイン済みなら0、未ログインなら1で終わる。スクリプトの事前確認に使える

短い応答が返るか

実際にモデルへのリクエストが通るかは、応答が返って初めて分かる。確認文にも通常どおり利用量がかかる

# 人が読める形で表示
claude auth status --text

# 終了コードを見る(macOS・Linux)
claude auth status; echo $?

# 終了コードを見る(PowerShell)
claude auth status; $LASTEXITCODE

応答の確認には、例えば次のような文を送ります。

接続確認です。ファイルの読み書きやツールの呼び出しはせず、
「応答できました」とだけ返してください。

5. 何度も出るときに確認すること

1回だけなら/loginで終わりです。数日おき、あるいは毎日のように出る場合は、次の項目を上から確かめます。どれも公式ドキュメントかCHANGELOGに書かれている事柄で、推測で足した項目はありません。まず版が古くないかを見てください。

claude --version
claude update

並列セッションとスリープ復帰

公式によると、同じマシンの並列セッションは保存ログインを共有し、更新は1プロセスずつ行う。v2.1.211より前は、スリープ復帰時に2つのセッションが同じトークンで更新し、保存ログインが無効化されて全セッションが一斉にログインを求められることがあった

古いビルドが同じマシンで動いている

CHANGELOGのv2.1.277に「IDE拡張に同梱されたCLIなど、古いビルドが同じマシンで動くと予期せずログアウトされる問題を修正」とある。そのとき出た表示の文言は書かれていない。CLIとIDE拡張の両方を更新する

macOSのキーチェーン

キーチェーンがロックされている、またはパスワードがアカウントとずれていると書き込みが拒否され、ログインは平文の~/.claude/.credentials.jsonに保存される。下の手順で書き込める状態に戻す

システムの時計

公式のトラブルシューティングは、トークンの検証が正しい時刻に依存するとして、頻繁にログインを求められるなら時計が正確か確かめるよう案内している。OSの自動時刻合わせを有効にする

複数アカウントとCLAUDE_CONFIG_DIR

CLAUDE_CONFIG_DIRを設定すると、資格情報はそのフォルダに置かれ、macOSのキーチェーンの項目もフォルダごとに分かれる。表示が出たセッションと違う値で/loginすると、ログインは別の保存先に入る

入り直しても同じ表示が続く

v2.1.235より前は、アカウントの保留もLogin expiredとして表示されていた。古い版で/loginしても消えないなら、更新してから表示を見直す

macOSでキーチェーンを書き込める状態に戻す

公式のトラブルシューティングにある手順です。claude doctorのレポートにmacOS Keychain is not writableで始まる警告が無ければ、キーチェーンは書き込める状態なので、手順4だけを行います。

  1. claude doctorでキーチェーンへのアクセスを確認する
  2. 警告があれば、次のコマンドでロックを解除し、もう一度claude doctorを実行する
  3. 解除しても警告が残るなら、Keychain Access(キーチェーンアクセス)でloginキーチェーンを選び、公式の手順にあるEdit > Change Password for Keychain "login"(英語表示での項目名)で、アカウントのパスワードと合わせる
  4. 警告が消えたら/logout/loginで入り直す。ログインがキーチェーンに保存し直される
claude doctor
security unlock-keychain ~/Library/Keychains/login.keychain-db

APIキーに切り替えれば、この表示は出なくなるか

出なくなります。ただし課金の仕組みが変わります。公式の優先順位では、ANTHROPIC_API_KEYは承認すると/loginのログインより優先され、-pの非対話モードでは設定されていれば常に使われます。その間の利用はサブスクリプションではなく、ConsoleのAPI利用料として課金されます。「Login expiredを避けたいから」という理由だけでAPIキーを置くのは勧めません。無人の実行が目的なら、サブスクリプションで使えるclaude setup-tokenのほうが目的に合います。

6. 報告されているが、原因が確定していない事例

Claude CodeのGitHubリポジトリには、この文言そのものを含む不具合報告があります。2026年9月22日に次の6件を開いて読みました。いずれも利用者による報告や推定で、読んだ範囲ではAnthropicの公開回答はありません。同じ症状でも原因が同じとは限らないので、手順として真似するのではなく、状況が似ているかの参考にしてください。

  • #94464(macOS・CLI 2.1.270):Claudeデスクトップアプリに内蔵されたClaude Codeと端末のCLIが同じ~/.claudeを使う環境で、端末側にほぼ毎日Login expiredが出るという報告。報告者は、内蔵版が更新したトークンがファイルにだけ書かれ、キーチェーン側に古いトークンが残ると推定している。追記には2.1.273でも同じ症状という報告がある
  • #88583(macOS・デスクトップアプリ同梱2.1.229):並列のセッションが更新を取り合い、キーチェーンの資格情報が空にされるという報告。追記には、Windowsの2.1.251でFailed to authenticate: OAuth session expired and could not be refreshedが出た例もある
  • #88947(Linux・2.1.228〜2.1.240):10〜24の対話セッションが1つの~/.claudeを共有する環境で、1週間以内の間隔ですべてのセッションがLogin expiredになるという報告
  • #95822(macOS):claude auth statusのような短時間で終わるコマンドが起動時に更新を始め、結果を保存せずに終了するため、使用済みのリフレッシュトークンが残るという指摘。監視ツールが数分おきに実行していた(観測は2.1.259)。4章のclaude auth statusを短い間隔で繰り返し実行するのは避けたほうが無難
  • #83834(Windows・2.1.221):サインインした直後でもLogin expiredになり、保存ファイルの有効期限の値が0になっていたという報告。追記ではLinuxの2.1.241でも同様とされる
  • #80605(macOS・2.1.218):資格情報とキーチェーンを消して再インストールしても表示が続き、/loginでサインイン画面が出なかったという報告。翌日にはサインインできたが、何が効いたかは分からないと報告者が書いている(クローズ済み)

前半4件に共通するのは、1台のマシンで複数のプロセスが同じ保存ログインを使っていることです。繰り返し出る場合は、同時に動いているClaude Code(端末のCLI、IDE拡張、デスクトップアプリ、バックグラウンドセッション)の数を控えておくと、報告するときに状況を正確に伝えられます。

7. それでも直らないときに残す情報

公式のトラブルシューティングは、解決しないときの窓口として次の4つを挙げています。

  • claude doctorで自動診断のレポートを出す
  • セッションを開けるなら、入力欄の/feedbackで報告する
  • GitHubのIssueで既知の問題を探し、無ければOS・インストール方法・エラー全文を添えて新規に報告する
  • ログインのループなどアカウント側の問題なら、claude.ai(Consoleの利用者はplatform.claude.com)にサインインし、左下のイニシャルから「Get help」でサポートに連絡する

報告メモのひな形

環境
claude --versionの結果/OS/インストール方法(ネイティブ・npm・デスクトップアプリ内蔵など)
表示
エラーの全文/発生時刻とタイムゾーン//statusのLogin行(メールは伏せる)
状況
同時に動いていたClaude Codeの数と種類/スリープ復帰や更新の直後だったか
試したこと
/login/logout・キーチェーンの確認などの前後で何が変わったか

8. まとめ

「Login expired · Please run /login」は、保存ログインの更新が拒否され、Claude Codeが資格情報を消したあとの表示です。リクエストは手元で止まっているので再試行では直らず、保存ログインを使い続けるなら/loginで入り直すしかありません。/statusで期限切れのアカウントを確かめ、同じアカウントでサインインし、短い応答で確認すれば完了です。

何度も出る場合は、版の更新、同じマシンで動く古いビルドやIDE拡張、macOSのキーチェーン、時計、CLAUDE_CONFIG_DIRの順に確認します。資格情報がそもそも無いNot logged inや、APIが拒否したOAuth token has expiredとは対処が違うので、表示の文言を最初に見比べてください。ほかのエラーはClaude Codeのよくあるエラーと解決法まとめにまとめています。

FAQ

Q. 「Login expired · Please run /login」はどういう意味ですか?
A. Claude Codeが保存していたログインを自動で更新しようとして拒否され、保存済みの資格情報を消した状態です。以後のリクエストはAPIに送られず、手元で止まります。/loginで入り直すと直ります。

Q. 何度か再試行すれば直りますか?
A. 直りません。資格情報がすでに消されているため、公式も「サインインせずに再試行すると、毎回同じメッセージになる」と説明しています。新しい資格情報を作れるのは/loginだけです。

Q. サブスクリプションが切れたということですか?
A. この表示だけでは分かりません。公式の説明は、保存ログインの更新が拒否されたというものです。アカウント自体が保留されている場合は「Your account is on hold」という別の表示になります。プランの状態は、サインインし直したあとに/statusやclaude.aiの設定画面で確かめてください。

Q. Not logged inとは何が違いますか?
A. Not logged inは、このセッションで使える資格情報が最初から無い状態です。Login expiredは、保存ログインがあったものの更新できずに消された状態です。直し方はどちらも/loginですが、Not logged inでは使うつもりだった環境変数が読み込まれているかも確認します。

参考にした一次情報