ANTIGRAVITY LABEN
記事一覧/連携・プラグイン
連携・プラグイン/2026-09-05上級

GOOGLE_GEMINI_BASE_URL を差し替えても、鍵の持ち主は変わりません

Antigravity CLI の宛先を自前のゲートウェイへ向けたとき、手元の API キーがどこまで運ばれるかを受け側で記録しました。クロスホストのリダイレクトで Authorization は落ちるのに API キーヘッダーは残る、という挙動差の実測と、鍵を端末から外すゲートウェイの組み方を書き残します。

antigravity453gemini17ゲートウェイ認証7integrations21

プレミアム記事

自分の端末とモデルの API のあいだに、一枚はさむことにしました。動機は素朴で、どのプロジェクトがどれだけ呼んでいるのかを一箇所で数えたかったのです。

GOOGLE_GEMINI_BASE_URL に自前の URL を書いて、受け取った内容をそのまま出力するだけの小さなサーバーを立てました。動くまでは数分でした。

届いたリクエストのヘッダーを眺めていて、手が止まりました。手元の端末に置いてあるはずの API キーが、そのまま一行として並んでいたのです。

考えてみれば当たり前でした。宛先を書き換えたのは私で、資格情報を外す指示はどこにも書いていません。それでも、設定ファイルを一行いじっただけで鍵の配達先が変わる、という手触りは想像していたよりも軽いものでした。

Antigravity CLI 1.1.13 で GEMINI_API_KEY による直接認証が入り、settings.jsonmodelProvider: "gemini" を書いて環境変数を渡せばサインインなしで動くようになりました。同じ変更のなかで、独自エンドポイント向けに GOOGLE_GEMINI_BASE_URL を設定できることも案内されています。手順としてはこの経路がいちばん短く、ローカルのエンジンや社内のゲートウェイに向けたい方は、まずここへ行き着くはずです。

だからこそ、向けた先に何が届くのかを一度だけ自分の目で確かめておく価値があります。以下は個人開発の環境で受け側を用意し、実際に記録した内容です。

受け側を用意して、届いたヘッダーをそのまま記録します

推測ではなく記録から始めます。上流へ中継せず、受け取ったヘッダーを配列に貯めるだけのサーバーを置きます。

# echo_srv.py — 受け取ったヘッダーを記録するだけの受け側
import threading, http.server, socketserver
 
LOGS = {}
 
def make_handler(name, redirect_to=None):
    LOGS[name] = []
 
    class H(http.server.BaseHTTPRequestHandler):
        protocol_version = "HTTP/1.1"
 
        def do_POST(self):
            n = int(self.headers.get("content-length", 0))
            self.rfile.read(n)                      # 本文は捨てます(記録対象はヘッダーです)
            LOGS[name].append({"path": self.path,
                               **{k.lower(): v for k, v in self.headers.items()}})
 
            # /final 以外に来たら 1 回だけ別の宛先へ飛ばします
            if redirect_to and not self.path.endswith("/final"):
                self.send_response(307)             # 307 はメソッドと本文を保ちます
                self.send_header("Location", redirect_to)
                self.send_header("Content-Length", "0")
                self.end_headers()
                return
 
            body = b'{"ok":true}'
            self.send_response(200)
            self.send_header("Content-Length", str(len(body)))
            self.end_headers()
            self.wfile.write(body)
 
        def log_message(self, *a):                  # 標準のアクセスログは黙らせます
            pass
 
    return H
 
def serve(port, handler):
    socketserver.TCPServer.allow_reuse_address = True
    srv = socketserver.TCPServer(("127.0.0.1", port), handler)
    threading.Thread(target=srv.serve_forever, daemon=True).start()
    return srv

307 を選んだのは、302 だと POST が GET に書き換わる実装があり、ヘッダー以外の変数が増えてしまうからです。測りたいものだけが動くようにします。

宛先を書き換えただけの場合、資格情報はそのまま届きます

まず、リダイレクトを挟まない素直な経路です。クライアントが送ったヘッダーがそのまま受け側に現れます。

import requests
 
HDRS = {
    "Authorization":        "Bearer ADC_TOKEN",   # ダミーです。実物は置きません
    "x-goog-api-key":       "KEY",
    "x-goog-user-project":  "my-project",
    "Content-Type":         "application/json",
}
 
serve(8914, make_handler("plain"))
requests.post("http://127.0.0.1:8914/a", headers=HDRS, json={}, timeout=5)
 
d = LOGS["plain"][-1]
print(sorted(k for k in d if k in ("authorization", "x-goog-api-key")))
# 実行結果: ['authorization', 'x-goog-api-key']

両方とも届きました。base_url の設定は経路を選ぶ設定であって、資格情報の扱いには手を触れていません。当然の結果ですが、ここを目で見ておくと、この後の差分が読みやすくなります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
自前のゲートウェイやローカルのエンジンに向ける前に、どの資格情報が一緒に運ばれるかを受け側で記録して確かめられるようになる
リダイレクトを一段はさむと Authorization は落ちるのに API キーのヘッダーは残る、という挙動差を前提にして転送ヘッダーを設計できるようになる
手元の端末から鍵を外してゲートウェイ側に持たせる構成へ、既存の設定を壊さない順番で移行できるようになる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

連携・プラグイン2026-07-06
自分のコードベースを Gemini 埋め込みと sqlite-vec で意味検索する — git 差分だけを再インデックスする増分パイプライン
自分のリポジトリを対象にした意味検索を、Gemini 埋め込みと sqlite-vec で構築する実装記録です。git の blob ハッシュで未変更ファイルの再埋め込みをスキップする増分パイプラインと、インデックスサイズ・クエリ遅延の実測値をまとめました。
連携・プラグイン2026-06-28
無人で回したエージェントの変更を、どこから見るか — 再入場のためのダイジェスト
無人実行のエージェントが夜間に40ファイルを書き換えた朝、diff を上から読むのを諦めました。敵は量ではなく再入場コストである、という整理から、リスク階級の機械分類、前回レビュー地点の持ち方、ダイジェストの自動組み立てと裏取り手順までを設計していきます。
連携・プラグイン2026-05-30
Antigravity に Crashlytics のスタックトレースを渡して直す — 4本のアプリで3週間運用した所感
Crashlytics に上がってくるクラッシュを、Antigravity にスタックトレースごと渡して原因を絞り、修正まで回す。壁紙アプリ4本で3週間続けてみて見えてきた、任せられる範囲と握っておくべき判断を実装に沿って書きました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →