Gateway 管理のペアリング
Gateway が管理するノードペアリング(案 B):iOS とその他のリモートノード向け。
"Gateway 管理のペアリング"モードでは、Gateway が「どのノードが参加を許可されているか」の唯一の真実のソースです。UI(macOS アプリ、将来のクライアント)は単なるフロントエンドです:保留中のリクエストを表示し、承認または拒否を可能にします。
''重要:'' WebSocket ノードは ''connect'' ハンドシェイク中に ''デバイスペアリング''(ロール ''connect'')を使用します。''node.pair.*'' は別の独立したペアリングストアであり、WS ハンドシェイクのアクセス制御には''影響しません''。''node.pair.*'' を明示的に呼び出すクライアントのみがこのフローを通ります。
Concepts
- 保留中のリクエスト(pending request):参加をリクエストし、承認を待っているノード。
- ペアリングされたノード(paired node):承認され、auth トークンを受け取ったノード。
- トランスポート(transport):Gateway WS エンドポイントはリクエスト/イベント転送を処理しますが、メンバーシップは Gateway のペアリングストアによって決定されます。(古い TCP ブリッジサポートは非推奨/削除されました。)
ペアリングフローの仕組み
1. ノードが Gateway WS に接続し、ペアリングリクエストを開始します。
2. Gateway が ''保留中のリクエスト''を保存し、イベント ''node.pair.requested'' を発行します。
3. CLI または UI でリクエストを承認/拒否します。
4. 承認後、Gateway が 新しいトークンを生成します(再ペアリングでトークンがローテーションされます)。
5. ノードがそのトークンを使用して再接続し、その後「ペアリング済み」とみなされます。
保留中のリクエストは 5 分後に自動的に期限切れになります。
CLI ワークフロー(ヘッドレス環境に対応)
openclaw nodes pending openclaw nodes approve '<requestId>' openclaw nodes reject '<requestId>' openclaw nodes status openclaw nodes rename --node '<id|name|ip>' --name "Living Room iPad"
''nodes status'' は、ペアリング済み/接続済みのノードとその能力宣言を表示します。
API サーフェス(gateway protocol)
イベント:
- ''node.pair.requested'' — 新しい保留中のリクエストが作成されたときに発行されます。
- ''node.pair.resolved'' — リクエストが承認/拒否/期限切れになったときに発行されます。
メソッド:
- ''node.pair.request'' — 保留中のリクエストを作成または再利用します。
- ''node.pair.list'' — 保留中 + ペアリング済みノードを一覧表示します。
- ''node.pair.approve'' — 保留中のリクエストを承認します(トークンを発行)。
- ''node.pair.reject'' — 保留中のリクエストを拒否します。
- ''node.pair.verify'' — ''{ nodeId, token }'' を検証します。
Notes:
- ''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 のストアを対象とします。