🚀

リモート開発環境でGemini CLIのGoogleアカウント認証認可が失敗する問題をcurlで解決する

に公開

こんにちは!kazzhiraです。

リモート開発環境でGemini CLIを使おうとしたとき、個人Googleアカウント認証後の認可でつまづいたことはありませんか?WSL2、Docker、SSH接続したサーバーなど、様々なリモート環境で同様の問題が発生します。

この記事では、ネットワーク分離されたリモート環境での認証問題をcurlコマンドで解決する方法をご紹介します。
この記事が公開された後に状況が変わることは十分に考えられるので、その点をご留意ください。

前提

リモート環境のCLIの要求を受けて透過的に開発PCのブラウザを開ける(VSCodeのremote ssh機能など)

注意その1: ブラウザを開けない、ブラウザがないケースでは検証しておりません
注意その2: 本記事の手順は主にWSL2環境で検証しており、全てのリモート環境での動作を保証するものではありません。他の環境では一部手順が異なる可能性があります。

時間がない人のために、先に解決策を

アカウント認証後にブラウザのアドレスバーに表示されたURLをコピーし、リモート環境のターミナルからcurlでそのURLにリクエストを送ることで、手動で認可を完了させます。
※curlじゃなくてもhttpを喋ることができれば何でもいいはず

以上です。より深く知りたい人は続きを読んでください。

問題の背景:リモート環境でのOAuth

問題の本質

リモート環境でGemini CLIを初回実行すると、OAuthのためにブラウザが起動します。しかし、ローカルのブラウザからリモート環境上のlocalhostにアクセスできないため、認証フローが終了できません。

これはネットワーク分離による問題で、以下のような環境で発生します:

  • WSL2(WindowsブラウザからWSL2内部へのアクセス)
  • Dockerコンテナ(ホストからコンテナ内部へのアクセス)
  • SSHリモートサーバ(ローカルからリモートサーバへのアクセス)

公式ドキュメントでも言及されている通り、ブラウザとCLIプロセスがローカルで通信できることが前提となっています。

Note that the web login must be done in a browser that can communicate with the machine Gemini CLI is being run from. (Specifically, the browser will be redirected to a localhost url that Gemini CLI will be listening on)
(出典: https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/authentication.md#workspace-gca)

ネットワーク設定で解決できるはずですが、環境ごとの設定の手間を考えると、よりシンプルな解決策が望ましいです。

改めて解決策

アカウント認証後にブラウザのアドレスバーに表示されたURLをコピーし、リモート環境のターミナルからcurlでそのURLにリクエストを送ることで、手動で認可を完了させます。
※curlじゃなくてもhttpを喋ることができれば何でもいいはず

この方法は以下のような特徴があります:

  • 環境固有の設定が不要
  • 初回設定のみで、以降は自動認証
  • WSL2、Docker、SSH環境など、様々なリモート環境で共通して使用可能

curlを使った認可手順

Step 1: リモート環境でGeminiコマンドを実行する

今回はテストとしてgemini -p "こんにちは!"を実行してみましょう。

gemini -p "こんにちは!"

すると、ターミナルに以下のようなメッセージが表示されます

認証方法選択

Login with Googleを選択すると、

Waiting for auth... (Press ESC to cancel)

Step 2: ローカルブラウザで認証する

自動的に表示された認証画面で、Gemini CLIで使いたいGoogleアカウントを選択し、ログインと権限の許可を進めてください。

Step 3: エラー画面のURLをコピーする

認証が完了すると、ブラウザはlocalhostへリダイレクトしようとしますが、接続できずに「このサイトにアクセスできません」といったエラー画面が表示されます。

リダイレクトエラー画面

ここが最重要ポイントです。
このエラー画面のアドレスバーに表示されているURL全体をコピーしてください。

URLは以下のような形式になっています。(※ポート番号やクエリは実行ごとに変わります)

# ダミーのURL例
http://localhost:nnnnn/oauth2callback?state=0123456789abcdef...&code=4/0A-dummy-code-from-google...&scope=email%20profile...

Step 4: リモート環境でcurlコマンドを実行する

リモート環境のターミナルで、Gemini CLIを実行しているプロセスとは別のターミナルでcurlコマンドを使い、先ほどコピーしたURLにリクエストを送ります。

重要: URLに&などの記号が含まれているため、必ずURL全体をダブルクォーテーション(")で囲んでください。

curl "http://localhost:35311/oauth2callback?state=...&code=...&scope=..."

セキュリティ上の注意:

  • URLには一時的な認証コードが含まれているため、コマンド履歴に残さないよう注意してください
  • URLをチャットやログに誤って貼り付けないよう十分注意してください

Step 5: 認証成功!

curlコマンドを実行すると、Step 1で実行したgemini -p "こんにちは!"の応答が返ってくるはずです。

これで認証は完了です!

おわりに

リモート開発環境でのGemini CLIの認証の失敗をcurlで解決する手順を紹介しました。

この方法はネットワーク分離された環境でのOAuthではよくあるのかもなと思いました。
自動でやってくれると一番楽で良いですけどね。

同様の課題で困っていた方の参考になれば幸いです。
ここまで読んでいただき、ありがとうございました!

Discussion