🤖 wrangler OAuth認証がSSH越しで失敗した話
Cloudflare Pages のデプロイ状態を wrangler CLI で確認しようとして、認証ではまった。
現象
NixOS サーバー(ブラウザなし、SSH接続)で wrangler login を実行。
$ wrangler login
# → ブラウザが開かず、localhost にリダイレクトされてエラー
Cloudflare の認証ページで承認後、localhost:8976 にコールバックが返ってくるが、NixOS 側にブラウザがないため受け取れない。
原因
wrangler login は OAuth PKCE フローを使っている。認証コードを受け取るために localhost で一時的な HTTP サーバーを立て、ブラウザからのコールバックを待つ仕組み。
問題は、操作している端末(Mac)と wrangler が動いている端末(NixOS)が別 なこと。Mac のブラウザで認証すると、コールバック先 localhost は Mac 自身の localhost を指す。当然そこに wrangler の待受サーバーはない。
これは以前はまった Google OAuth Desktop App とまったく同じ構図。デスクトップアプリ用の OAuth フローが、リモートの CLI 環境では機能しない。
対策
SSH ポートフォワードを使う。
(1) Mac からポートフォワード付きで SSH 接続
ssh -L 8976:localhost:8976 nixos
これで Mac の localhost:8976 へのアクセスが NixOS の localhost:8976 に転送される。
(2) NixOS 側で wrangler 認証(URL 表示のみ)
wrangler login --no-browser
ブラウザがなくても URL がコンソールに表示される。
(3) Mac のブラウザにその URL を貼り付けて開く
Cloudflare で承認すると localhost:8976 にリダイレクト → SSH ポートフォワードで NixOS に届く → wrangler がトークンを受け取って認証完了。
一般化
このパターンは OAuth を使う CLI ツール全般で起こる。SSH 越しでブラウザがない環境では、以下のどちらかで対応できる:
| 方法 |
用途 |
| SSH ポートフォワード |
ワンショットの認証。ssh -L <port>:localhost:<port> でコールバックを中継 |
| API トークン |
常時使うならトークン方式の方が楽。export CLOUDFLARE_API_TOKEN=... で認証 |