Claude CodeのCodespacesログインで「Invalid code」が出る原因と対処法
GitHub CodespacesでClaude Codeのログインが「Invalid code」で止まる、パネルが真っ白のまま動かない。報告されている2つの症状の見分け方と、ドキュメントの手順、回避策をまとめます。
GitHub Codespacesでターミナルからclaudeを起動してログインすると、ブラウザで認可したのに「OAuth error: Invalid code」と返される。別の症状として、VS CodeのClaude Codeパネルが真っ白のまま何も表示されない。どちらもGitHubのissueに報告されていますが、どちらもopenのままで、修正バージョンは示されておらず、確定した恒久対策はありません。
この記事では、2つの症状を見分ける方法と、ドキュメントにある手順、報告者が見つけた回避策を順に示します。
Codespacesで起きる2つの症状を見分ける
「CodespacesでClaude Codeが使えない」と一口に言っても、原因の違う症状が混ざっています。先に見分けておくと、試す対処が半分に絞れます。
| 症状 | 出る場所 | 見えるメッセージ | CLIは使えるか |
|---|---|---|---|
| ログインが通らない | 出る場所ターミナルのclaude / claude setup-token | 見えるメッセージOAuth error: Invalid code | CLIは使えるかログイン前なので使えない |
| パネルが真っ白 | 出る場所VS CodeのClaude Codeパネル | 見えるメッセージ画面は空白、Outputログにロック競合 | CLIは使えるかターミナルのCLIは動く |
前者はissue #91176、後者はissue #88977で報告されています。どちらもstateはopenです。
認証の症状は「コードを貼っても受け付けられない」こと。パネルの症状は「認証済みなのに画面が出ない」ことです。後者は認証ではなく、拡張機能の起動側の問題として報告されています。
「Invalid code」とは何を意味するエラーか
エラー文の全文はOAuth error: Invalid code. Please make sure the full code was copiedです。トラブルシューティングのページでは、ログインコードが期限切れになったか、コピー時に途中で切れたときに出るエラーとして説明されています。
対処として挙げられているのは3つです。
- Enterキーで再試行し、ブラウザが開いたらすぐにログインを完了させる
- ブラウザが自動で開かないときは
cキーでURL全体をコピーする - リモートやSSHのセッションでは、ブラウザが別のマシンで開くことがあるため、ターミナルに表示されたURLを手元のブラウザで開く
Codespacesはクラウド上のコンテナなので、3つ目の条件にそのまま当てはまります。まずはこの3点を、コードを貼る手際も含めて試すのが出発点です。
ただし、issue #91176の報告者はこれを試した上で失敗しています。新しいコードで何度もやり直し、コードだけを貼る、コードとstateを#でつないで貼る、/loginとsetup-tokenの両方を使う、という組み合わせを試しても結果は同じでした。単純なコピーミスでは説明できないケースがある、ということです。
ブラウザが戻ってこない理由とコードの貼り付け
Codespaces、WSL2、SSH、コンテナでは、ブラウザが別のホストで開きます。認可後のリダイレクト先はClaude Codeがローカルで待ち受けるコールバックサーバーですが、ブラウザからは届きません。認証のページによると、この場合は自動で戻る代わりにブラウザにログインコードが表示され、それをターミナルのPaste code here if promptedというプロンプトに貼れば完了します。
貼り付けが反応しないときの代替として、claude auth loginが案内されています。このコマンドは標準入力から貼り付けられたコードを読みます。
claude auth loginissue #91176の報告では、次の挙動が見えています。
claudeを実行すると、ブラウザのポップアップが「外部のWebサイトを開くか」と聞いてくる- このポップアップの短縮URLを開くと、
localhost:PORT/callbackへリダイレクトされ、ERR_CONNECTION_REFUSEDになる - ターミナルに別途表示される長いURL(
https://claude.com/cai/oauth/authorize?code=true&client_id=...)を手動でブラウザに貼ると認可画面までは進む - 認可後もlocalhostへの接続拒否になるか、
setup-tokenの場合はコード入力待ちになり、貼るとInvalid codeが返る
報告者自身も、ポップアップのURLとターミナルに表示されるURLでリダイレクト先が違うように見える点を、原因に関係するかもしれないと書いています。確定した原因ではなく、観察された違いとして読んでください。
報告されている回避策: redirect_uriを書き換える
同じissueのコメントに、Codespacesをブラウザ(github.dev)で開いている利用者の回避策が書かれています。Claude Codeが生成するログインリンクには、redirect_uri=http://localhost:[port]/callbackが含まれます。このアドレスはCodespacesに届かないため、コードが表示されません。
そこで、リンク全体をコピーし、redirect_uriの値を次のURLエンコード済みの文字列に置き換えてから、Authorizeを押します。
redirect_uri=https%3A%2F%2Fplatform.claude.com%2Foauth%2Fcode%2Fcallbackすると次のページにコードが表示され、待機中のターミナルに貼ると通った、という報告です。
注意点が3つあります。
- 公式ドキュメントには載っていない、利用者個人の報告です
- ログインの試行ごとに必要な手順で、恒久的な修正ではありません
- 同じログイン試行が待機している間だけ有効です。ターミナルを閉じたり、
claudeを起動し直したりした後のリンクは使えません
報告者はclaude setup-tokenでも通るかは試せていないと書いています。また、別の利用者が追記した事例(この記事の「Codespaces以外で報告されている類似例」)は、この手順では説明できないと本人が述べています。
認証を通せないときの別ルート
どうしてもブラウザ認可が通らないときの選択肢を、ドキュメントの記述から並べます。
devcontainerのページには、Codespacesをまたいで認証を引き継ぐ方法として、次のどちらかをCodespacesのシークレットに登録する案があります。Codespacesはシークレットをコンテナ内の環境変数として自動で渡します。
ANTHROPIC_API_KEYclaude setup-tokenで作ったCLAUDE_CODE_OAUTH_TOKEN
ここに落とし穴があります。issue #91176では、setup-tokenのフローも同じInvalid codeで失敗しています。トークンを作る段階でつまずくなら、この経路は使えません。
もう一方のAPIキーなら、ブラウザ認可を経由しません。ただし、サブスクリプションの利用枠ではなくAPIの課金になる点は、先に確認してください。報告者のひとりは、ANTHROPIC_API_KEYが空で代替の認証経路がなかった、とも書いています。
なお、CLAUDE_CODE_OAUTH_TOKENで認証できるのは、Pro / Max / Team / Enterpriseのプランを使うモデルリクエストです。Remote Controlのセッションの確立や、claude.aiのコネクタの取得はできません。
Codespaces以外で報告されている類似例
issue #91176には、Codespacesではなくプロキシ越しのヘッドレスLinux VMで同じInvalid codeに遭遇した利用者の追記があります。この事例のポイントは次のとおりです。
- Teamアカウントと別の個人アカウントの両方で再現した
- Claude Codeのバージョンを変えても再現し、
setup-token、claude auth login、旧来のclaude loginのどれでも同じだった - 返ってくるコードは50〜52文字ほどの長い不透明な文字列で、5〜7秒で貼っても拒否された
- その前日に、トークン交換のエンドポイントがHTTP 429(
rate_limit_error)を約3時間返していた
投稿者は、429の後にサーバー側かネットワーク経路で何らかの制限が残っている可能性を、未確認の仮説として挙げています。原因の特定には至っていません。
CodespacesでInvalid codeが出ていて、直前に何度もログインを繰り返していたなら、短時間に試行を重ねるのは避けたほうが無難です。この追記では、利用者自身が悪化を避けるために試行を止めています。
ログインそのものが繰り返し求められるときは何度もログインを求められる原因と対処法、認可画面でループするときはログインがループする問題が別の症状として整理されています。
パネルが真っ白のままになるとき
次に、認証ではなく表示の症状です。issue #88977では、Codespace内のVS CodeでClaude Codeパネルが空白のまま、入力欄もセッションも出ません。サイドバーのアイコン、エディタタブ、開き直したタブのどこから開いても同じでした。
注目点は、切り分けの結果です。
- 同じCodespaceのターミナルで
claudeを実行すると、認証済みで問題なく動く - 同じウィンドウのGitHub Copilot ChatとCodexのパネルは正常に表示される
- ウィンドウの再読み込みでも直らない
つまり、認証情報やCodespace全体ではなく、Claude Codeの拡張機能のパネルだけが立ち上がらない状態です。報告されたバージョンは2.1.241で、2.1.239でも一時的に確認されたとあります。
Outputログに出る行
報告者がClaude CodeのOutputチャンネルで見つけたのは、起動と終了の繰り返しと、次のようなロック競合のログです。
[error] Failed to load config cache: Error: Channel canceled mid-launch
[ERROR] Failed to save config with lock: Error: Lock file is already being held
[DEBUG] Lock acquisition took longer than expected - another Claude instance may be runningissueのタイトルは、同時に起動したセッションが設定ファイル.claude.jsonのロックを取り合ってデッドロックする、という見立てです。ただしこれは報告者の推測で、コメントはなく、ラベルはstaleが付いたまま、原因は検証されていません。
今できる切り分け
公式ドキュメントのVS Code拡張のページには、サインイン画面が出ないときはコマンドパレットの「Developer: Reload Window」でウィンドウを読み込み直す、という手順があります。報告者はこの再読み込みを試して改善しなかったため、パネルが白いこの症状には効かない可能性が高いです。
実用的には、次の順で見るのが現実的です。
- ターミナルで
claudeが動くかを確かめる。動くなら、作業はCLIで続けられる - OutputパネルでClaude Codeのチャンネルを開き、
Lock file is already being heldの行があるか確かめる - 同じ行があれば、issue #88977と同じ症状。ウィンドウを再読み込みしても変わらなければ、パネルは使わずCLIを使う
ロックファイルを手で消す手順は、このissueにも公式ドキュメントにも載っていません。他のセッションが使用中の可能性があるため、確かな根拠のない削除は避けてください。
切り分けの早見表
ここまでの内容を、症状から対処を引ける形にまとめます。
| 見えている状況 | まず試すこと | 効かないとき |
|---|---|---|
Invalid code、コードは貼れている | まず試すことEnterで再試行し、認可から貼り付けまでを素早く行う | 効かないときclaude auth loginに切り替える |
| ブラウザがlocalhostで接続拒否 | まず試すことターミナルに表示された長いURLを手動で開く | 効かないときredirect_uriの書き換え(個人の報告) |
setup-tokenも失敗する | まず試すことAPIキーをシークレットに登録する(課金経路は別) | 効かないとき試行を空けてから再開する |
| パネルが真っ白、CLIは動く | まず試すことターミナルのCLIで作業を続ける | 効かないときログのロック競合の行をissueに追記する |
まとめ
CodespacesのInvalid codeは、コピーミスや期限切れという一般的な原因に加えて、コンテナ内ではブラウザの戻り先が届かないという構造的な事情が重なっています。公式の手順とclaude auth loginでも通らない場合は、redirect_uriの書き換えが一つの手がかりです。
パネルが真っ白の症状は認証とは別物で、CLIが動く限り作業は止まりません。どちらのissueも修正版は示されていないため、バージョンを上げる前後でログインとパネルの両方を試して、結果をissueに書き込むことが次の一手になります。導入手順そのものはClaude Code CodespacesでDevContainer開発を始める手順にあります。