「Couldn't save your login」と別プロセスのリフレッシュ待ちの対処
「Couldn't save your login」と「another Claude Code process is refreshing it」は別の原因です。キーチェーンのロックとリフレッシュロックの見分け方と直し方を示します。
ログイン周りで出る2つの英語メッセージは、どちらも「ログインできない」ように見えて、原因も直し方も違います。Couldn't save your login は、ログイン自体は通ったのに認証情報を保存できなかった状態です。Could not refresh your login because another Claude Code process is refreshing it は、保存済みのログインの更新が他のプロセスに塞がれている状態で、ログインは拒否されていません。
2つのメッセージは何が違うのか
最初に見るのは、ログイン操作の最中に出たのか、普段の作業中に出たのかです。
2つのメッセージの違い
Couldn't save your login
/login の途中で出ます。claude.aiでのサインインは成功していますが、認証情報の保存先に書き込めず、ログインは完了していません。
Could not refresh your login ...
作業中のリクエスト前に出ます。保存済みのログインは期限切れで更新が必要でしたが、更新用の共有ロックを他のClaude Codeプロセスが握っています。
どちらの状況で出たかで、見る場所が分かれます。保存の失敗ならキーチェーン、更新の待ちなら他のプロセスです。
Couldn't save your login — キーチェーンが書き込めない
メッセージは2種類あります。
Couldn't save your login. If your Mac's keychain is locked, unlock it and log in again.
Couldn't save your login. Try logging in again.前者はmacOSで、後者はそれ以外の環境で出ます。macOSでは、スリープやアイドルでログインキーチェーンがロックされると起こります。条件は、同じセッションの中でClaude Codeがすでにキーチェーンから認証情報を読み書きしたあとであることです。タイムアウトや読めない保存先といった一時的な失敗でも、同じ文言になります。
つまり、文言だけではロックが原因かどうかは決まりません。まずロックを疑って確かめ、違えば再実行に回します。
macOSでの直し方
security unlock-keychain \
~/Library/Keychains/login.keychain-dbキーチェーンを解除して入り直す
- 1
ログインキーチェーンのロックを解除する
security unlock-keychainを上のコマンドで実行し、聞かれたらキーチェーンのパスワードを入力します。 - 2
/login をもう一度実行する
ロックが原因なら、ここで保存に成功します。
- 3
それでも保存されないとき
claude doctorでキーチェーンの状態を見て、案内に従います。
解除してもだめなときは、復旧手順がもう一段あります。claude doctor のレポートに macOS Keychain is not writable で始まる警告が出ていれば、キーチェーンが書き込みを拒否しています。その場合はKeychain Accessで login キーチェーンを選び、パスワードをアカウントのパスワードに合わせ直します。そのあと claude doctor を再実行して警告が消えたことを確かめます。
書き込みを拒否されたあとの保存先
キーチェーンが書き込みを拒否すると、Claude Codeはログインを平文の ~/.claude/.credentials.json に保存することがあります。SSHセッションでロックされている場合や、キーチェーンのパスワードがアカウントのパスワードとずれている場合です。Consoleログインでは、キーチェーンが書き込めるようになるまでAPIキーの作成が失敗します。
暗号化された保存先へ戻すには、キーチェーンを書き込める状態にしたうえで /logout と /login を実行します。/logout は保存済みの認証情報をすべて消します。MCPサーバーのログインとプラグインの機密値も含まれるため、再認可と再入力が必要です。
macOS 26で成功表示のあとも保存されない報告は、別の症状としてClaude CodeでmacOS 26の/loginが成功してもトークンが保存されないにまとめています。
別プロセスがリフレッシュ中と言われたとき
2つ目のメッセージは次の形です。
Could not refresh your login because another Claude Code process is refreshing it (or exited mid-refresh) · Try again in a minute; if it keeps happening, close other Claude Code windows or sign in again with /loginドキュメントははっきり「ログインが拒否されたという意味ではない」と書いています。保存済みのclaude.aiログインが期限切れで更新が必要だったところ、同じマシン上の別プロセスが共有のリフレッシュロックを握っていた、という状態です。ロックを持ったまま異常終了したプロセスが残していった場合も含みます。更新が進まないまま待たされ、Claude Codeはリクエストを送る前に止まります。
並行セッションは1つの保存済みログインを共有し、更新を1プロセスずつ行うよう調整しています。2つ目のメッセージは、この調整が詰まった側の表示です。
順番に試すこと
リフレッシュ待ちの切り分け
- Q1分ほど待って再実行すると通るか?答えが通らない答えがはい
他のプロセスが更新を終えれば、このセッションは更新後のログインを使います。通ったなら対処は不要です。
- Q他にClaude Codeのウィンドウやプロセスは動いているか?答えが動いていない答えがはい
それらを閉じてから再実行します。ロックを抱えたままのプロセスが原因なら、ここで解消します。
/login で入り直す
他のClaude Codeプロセスが動いていないのに出続けるなら、/login を実行します。サインインし直す操作は、リフレッシュロックを待ちません。
ほかのClaude Codeが動いているかは、ターミナルのタブやIDEの統合ターミナルまで含めて探します。見つけにくいときは、プロセス一覧で絞る方法もあります。
pgrep -fl claudepgrep は一般的なプロセス確認のコマンドです。表示された内容は、自分が起動したものかを見てから閉じてください。
非対話モードとSDKでは文言が変わる
-p による非対話モードとAgent SDKでは、同じ状態でも文言が変わり、構造化されたエラーコードも付きます。
| 状態 | 非対話モード / SDKの文言 | エラーコード |
|---|---|---|
| 別プロセスがリフレッシュ中 | 非対話モード / SDKの文言Failed to refresh OAuth token: another Claude Code process is refreshing it or exited mid-refresh. ... | エラーコードserver_error |
| 保存済みログインの更新に失敗 | 非対話モード / SDKの文言Failed to authenticate: OAuth session expired and could not be refreshed | エラーコードauthentication_failed |
2行目は後述の「Login expired」の非対話版です。server_error の側は、文言に「通常は一時的で、1分後に再試行する」とあります。スクリプトで拾うなら、server_error は待って再試行、authentication_failed は人が /login する、と処理を分けられます。
APIキー、CLAUDE_CODE_OAUTH_TOKEN、サードパーティプロバイダーで認証しているセッションは、保存済みのログインを使いません。そのため、リフレッシュ待ちのメッセージ(と Login expired)には当たりません。ANTHROPIC_API_KEY を使う構成なら、CIや夜間ジョブでもこのメッセージは出ません。サブスクリプションで動かしたい場合は、claude setup-token で長期トークンを作り、CLAUDE_CODE_OAUTH_TOKEN に設定する方法があります。
SSHやmacOS以外で出たとき
キーチェーンのロックはGUIのスリープ復帰だけで起きるわけではありません。ドキュメントは、SSHセッションの中でキーチェーンがロックされている場合も、書き込みの拒否例に挙げています。Macにリモート接続して claude を動かしているときに保存の失敗が出るなら、接続先のMacでログインキーチェーンが解除されているかを先に見ます。
macOS以外では文言が Try logging in again. になり、対処は /login の再実行です。キーチェーンの解除手順は当てはまりません。ここで保存先の読み取りや書き込みが一時的に失敗しているだけなら、再実行で通ります。2回続けて失敗するときは、/login を繰り返すより、保存先の状態を疑う段階です。
どちらのメッセージでも確かめる3点
対処に入る前でも後でも、次の3点を見ておくと遠回りを避けられます。
- 認証に使っている手段は何か。APIキーや
CLAUDE_CODE_OAUTH_TOKENが設定されていれば、リフレッシュ待ちのメッセージ(とLogin expired)は出ない - 同じ設定ディレクトリを使うウィンドウは、いくつ開いているか
- Claude Codeのバージョンは古くないか。
Login expiredの扱いはv2.1.206とv2.1.210、スリープ復帰時のトークン失効はv2.1.211、別ウィンドウのログイン反映はv2.1.286で変わっています(詳細は後述)
似たメッセージとの見分け方
「ログインし直して」と言われる文言は複数あります。直し方が違うので、文言で切り分けます。
| 文言 | 状態 | 次の一手 |
|---|---|---|
Couldn't save your login | 状態サインイン後の保存に失敗 | 次の一手キーチェーン解除 → /login |
Could not refresh your login because another ... | 状態更新ロックが塞がっている | 次の一手待つ → 他を閉じる → /login |
Login expired · Please run /login | 状態更新が拒否され、保存済みの認証情報をClaude Codeが消した | 次の一手/login |
Not logged in · Please run /login | 状態有効な認証情報がない | 次の一手/login、または環境変数の確認 |
Login expired は、保存済みのリフレッシュトークンをOAuthサービスが拒否した状態です。v2.1.206より前は、残っていた認証情報のままモデルへリクエストを送り、モデル選択エラーや401になっていました。/status の Login 行が Expired — log in again と表示されるのはv2.1.210以降で、それより前は何も出ませんでした。
Not logged in は、同じ設定ディレクトリを使う別ウィンドウでclaude.aiにログインすれば、対話セッションが自動でそのログインを使い始めます。ただしv2.1.286より前のmacOSでは、別ウィンドウでログインしたあともメッセージが出続けることがあり、その場合はセッションを再起動します。
アカウント側の拒否を伴う文言は別物です。クラウドセッションの作成が401で断られる場合は「Claude login not accepted」の原因と対処を参照してください。
繰り返し出るときに見直すこと
2つ目のメッセージが頻繁に出るなら、並行セッションの使い方に原因があるかもしれません。複数のウィンドウを同時に再開した直後や、スリープから復帰した直後に集中するパターンです。v2.1.211より前は、スリープからの復帰で2つのセッションが同じトークンで更新をかけ、保存済みログインが失効して全セッションに再ログインが求められることがありました。古いバージョンを使っているなら、更新が先です。
再ログインが頻発する背景はClaude Codeで何度もログインを求められる原因と対処法で扱っています。システム時計のずれもトークン検証に影響するため、あわせて確認する項目です。
まとめ
保存の失敗はキーチェーン、更新待ちはプロセス間のロックが原因で、直す場所が違います。文言を見て、Couldn't save your login ならロック解除、another Claude Code process is refreshing it なら待つか他を閉じる、と分けてください。どちらも解消しなければ /login が最後の手段で、後者は更新ロックを待たずに通ります。