Gateway 所有のペアリング(オプション B)
Gatewayが所有するペアリングでは、Gatewayはノード が参加することを許可されている真実の源です。 UI(macOS アプリ、将来のクライアント)は、 保留中のリクエストを承認または拒否するだけのフロントエンドです。 重要: WS ノードは、connect の間に デバイスペアリング(ロール node)を使用します。
node.pair.* は別個のペアリングストアであり、WS ハンドシェイクを 制御しません。
このフローを使用するのは、明示的に node.pair.* を呼び出すクライアントのみです。
node.pair.* はペアリングストアであり、WSハンドシェイクのゲートを****しません**。
明示的に node.pair.* を呼び出すクライアントのみがこのフローを使用します。
概念
- 保留中のリクエスト: 参加を要求したノード。承認が必要です。
- ペアリング済みノード: 承認され、認証トークンが発行されたノードです。
- トランスポート: Gateway WS エンドポイントはリクエストを転送しますが、メンバーシップは判断しません。(レガシー TCP ブリッジのサポートは非推奨/削除されています。) (レガシーTCPブリッジのサポートは非推奨/削除されました。 (レガシーTCPブリッジのサポートは非推奨/削除されました。
ペアリングの仕組み
- ノードが Gateway WS に接続し、ペアリングを要求します。
- Gateway は 保留中のリクエスト を保存し、
node.pair.requestedを発行します。 - リクエストを承認または拒否します(CLI または UI)。
- 承認されると、ゲートウェイは新しいトークン を発行します(トークンは再ペアで回転します)。
- ノードはトークンを使用して再接続し、「ペアリング済み」となります。
CLI ワークフロー(ヘッドレス対応)
nodes status は、ペアリング済み/接続中のノードとその機能を表示します。
API サーフェス(ゲートウェイ プロトコル)
イベント:node.pair.requested— 新しい保留中リクエストが作成されたときに発行されます。node.pair.resolved— リクエストが承認/拒否/失効したときに発行されます。
node.pair.request— 保留中リクエストを作成または再利用します。node.pair.list— 保留中およびペアリング済みノードを一覧表示します。node.pair.approve— 保留中リクエストを承認します(トークンを発行)。node.pair.reject— 保留中リクエストを拒否します。node.pair.verify—{ nodeId, token }を検証します。
node.pair.requestはノードごとに冪等です。繰り返し呼び出しても同じ保留中リクエストが返されます。- 承認は 常に 新しいトークンを生成します。
node.pair.requestからトークンが返されることは決してありません。 - リクエストには、自動承認フローのヒントとして
silent: trueを含めることがあります。
自動承認(macOS アプリ)
macOS アプリは、次の場合に サイレント承認 を試行できます。- リクエストが
silentとマークされている場合。 - 同一ユーザーを使用して、ゲートウェイ ホストへの SSH 接続をアプリが検証できる場合。
ストレージ(ローカル、非公開)
ペアリング状態は Gateway の状態ディレクトリ(デフォルト~/.openclaw)配下に保存されます。
~/.openclaw/nodes/paired.json~/.openclaw/nodes/pending.json
OPENCLAW_STATE_DIR を上書きした場合、nodes/ フォルダーもそれに伴って移動します。
セキュリティに関する注意:
- トークンは秘密情報です。
paired.jsonを機密情報として扱います。 - トークンのローテーションには再承認が必要です(またはノードエントリを削除します)。
トランスポートの挙動
- トランスポートは ステートレス であり、メンバーシップを保存しません。
- Gateway がオフライン、またはペアリングが無効な場合、ノードはペアリングできません。
- Gateway がリモートモードの場合でも、ペアリングはリモート Gateway のストアに対して行われます。