Bij door Gateway beheerde koppeling is de Gateway de bron van waarheid voor welke nodes
mogen deelnemen. UI’s (macOS-app, toekomstige clients) zijn alleen frontends die
wachtende verzoeken goedkeuren of afwijzen.
Belangrijk: WS-nodes gebruiken apparaatkoppeling (rol node) tijdens connect.
node.pair.* is een aparte koppelingsopslag en blokkeert de WS-handshake niet.
Alleen clients die expliciet node.pair.* aanroepen gebruiken deze flow.
Concepten
- Wachtend verzoek: een node vroeg om deel te nemen; vereist goedkeuring.
- Gekoppelde node: goedgekeurde node met een uitgegeven auth-token.
- Transport: het Gateway-WS-eindpunt stuurt verzoeken door, maar beslist niet
over lidmaatschap. (Ondersteuning voor de legacy TCP-bridge is verwijderd.)
Hoe koppeling werkt
- Een node maakt verbinding met de Gateway-WS en vraagt koppeling aan.
- De Gateway slaat een wachtend verzoek op en emitteert
node.pair.requested.
- Je keurt het verzoek goed of wijst het af (CLI of UI).
- Bij goedkeuring geeft de Gateway een nieuw token uit (tokens worden geroteerd bij opnieuw koppelen).
- De node maakt opnieuw verbinding met het token en is nu “paired”.
Wachtende verzoeken verlopen automatisch na 5 minuten.
CLI-workflow (geschikt voor headless gebruik)
openclaw nodes pending
openclaw nodes approve <requestId>
openclaw nodes reject <requestId>
openclaw nodes status
openclaw nodes remove --node <id|name|ip>
openclaw nodes rename --node <id|name|ip> --name "Living Room iPad"
nodes status toont gekoppelde/verbonden nodes en hun capabilities.
API-oppervlak (gatewayprotocol)
Events:
node.pair.requested - geëmiteerd wanneer een nieuw wachtend verzoek wordt aangemaakt.
node.pair.resolved - geëmiteerd wanneer een verzoek wordt goedgekeurd/afgewezen/verlopen.
Methoden:
node.pair.request - maak een wachtend verzoek aan of hergebruik het.
node.pair.list - lijst wachtende + gekoppelde nodes op (operator.pairing).
node.pair.approve - keur een wachtend verzoek goed (geeft token uit).
node.pair.reject - wijs een wachtend verzoek af.
node.pair.remove - verwijder een gekoppelde node. Voor apparaatondersteunde koppelingen
trekt dit de node-rol van het apparaat in: het muteert devices/paired.json en
maakt node-rolsessies van dat apparaat ongeldig/verbreekt ze. Een gemengde-rollen
apparaat (bijvoorbeeld als het ook operator heeft) behoudt zijn rij en verliest alleen de node
rol; een apparaatrij met alleen node wordt verwijderd. Het verwijdert ook elke overeenkomende legacy
door gateway beheerde node-koppelingsvermelding. Authz: operator.pairing mag
niet-operator-node-rijen verwijderen; een apparaat-token-aanroeper die zijn eigen node-rol op
een gemengde-rollen apparaat intrekt heeft daarnaast operator.admin nodig.
node.pair.verify - verifieer { nodeId, token }.
Notities:
node.pair.request is idempotent per node: herhaalde aanroepen retourneren hetzelfde
wachtende verzoek.
- Herhaalde verzoeken voor dezelfde wachtende node verversen ook de opgeslagen node
metadata en de nieuwste allowlisted declaratieve opdracht-snapshot voor zichtbaarheid voor de operator.
- Goedkeuring genereert altijd een vers token; er wordt nooit een token geretourneerd door
node.pair.request.
- Operator-scope-niveaus en controles tijdens goedkeuring worden samengevat in
Operator-scopes.
- Verzoeken kunnen
silent: true bevatten als hint voor automatische-goedkeuringsflows.
node.pair.approve gebruikt de gedeclareerde opdrachten van het wachtende verzoek om
extra goedkeuringsscopes af te dwingen:
- verzoek zonder opdracht:
operator.pairing
- verzoek met niet-exec-opdracht:
operator.pairing + operator.write
- verzoek voor
system.run / system.run.prepare / system.which:
operator.pairing + operator.admin
Node-koppeling is een vertrouwens- en identiteitsflow plus tokenuitgifte. Het pint het live node-opdrachtoppervlak per node niet vast.
- Live node-opdrachten komen voort uit wat de node declareert bij verbinding nadat het globale node-opdrachtbeleid van de gateway (
gateway.nodes.allowCommands en denyCommands) is toegepast.
- Per-node
system.run toestaan- en vraagbeleid leeft op de node in exec.approvals.node.*, niet in de koppelingsrecord.
Node-opdrachtbeperking (2026.3.31+)
Incompatibele wijziging: Vanaf 2026.3.31 zijn node-opdrachten uitgeschakeld totdat node-koppeling is goedgekeurd. Alleen apparaatkoppeling is niet langer genoeg om gedeclareerde node-opdrachten bloot te stellen.
Wanneer een node voor het eerst verbinding maakt, wordt koppeling automatisch aangevraagd. Totdat het koppelingsverzoek is goedgekeurd, worden alle wachtende node-opdrachten van die node gefilterd en niet uitgevoerd. Zodra vertrouwen is vastgesteld via koppelingsgoedkeuring, worden de gedeclareerde opdrachten van de node beschikbaar, onderworpen aan het normale opdrachtbeleid.
Dit betekent:
- Nodes die eerder alleen op apparaatkoppeling vertrouwden om opdrachten bloot te stellen, moeten nu node-koppeling voltooien.
- Opdrachten die vóór koppelingsgoedkeuring in de wachtrij stonden, worden gedropt, niet uitgesteld.
Vertrouwensgrenzen voor node-events (2026.3.31+)
Incompatibele wijziging: Door nodes gestarte runs blijven nu op een verkleind vertrouwd oppervlak.
Door nodes gestarte samenvattingen en gerelateerde sessie-events zijn beperkt tot het beoogde vertrouwde oppervlak. Door notificaties gedreven of door nodes getriggerde flows die eerder op bredere host- of sessietooltoegang vertrouwden, moeten mogelijk worden aangepast. Deze verharding zorgt ervoor dat node-events niet kunnen escaleren naar hostniveau-tooltoegang buiten wat de vertrouwensgrens van de node toestaat.
Duurzame updates van node-aanwezigheid volgen dezelfde identiteitsgrens. Het node.presence.alive-event wordt
alleen geaccepteerd van geauthenticeerde node-apparaatsessies en werkt koppelingsmetadata alleen bij wanneer de
apparaat-/node-identiteit al gekoppeld is. Zelfgedeclareerde client.id-waarden zijn niet genoeg om
laatst-gezien-status te schrijven.
Automatische goedkeuring (macOS-app)
De macOS-app kan optioneel proberen een stille goedkeuring uit te voeren wanneer:
- het verzoek is gemarkeerd als
silent, en
- de app een SSH-verbinding met de gatewayhost kan verifiëren met dezelfde gebruiker.
Als stille goedkeuring mislukt, valt de app terug op de normale prompt “Approve/Reject”.
Automatische goedkeuring voor vertrouwde CIDR-apparaten
WS-apparaatkoppeling voor role: node blijft standaard handmatig. Voor private
nodenetwerken waarbij de Gateway het netwerkpad al vertrouwt, kunnen operators
zich aanmelden met expliciete CIDR’s of exacte IP’s:
{
gateway: {
nodes: {
pairing: {
autoApproveCidrs: ["192.168.1.0/24"],
},
},
},
}
Beveiligingsgrens:
- Uitgeschakeld wanneer
gateway.nodes.pairing.autoApproveCidrs niet is ingesteld.
- Er bestaat geen algemene LAN- of privatenetwerkmodus voor automatische goedkeuring.
- Alleen verse
role: node-apparaatkoppeling zonder gevraagde scopes komt in aanmerking.
- Operator-, browser-, Control UI- en WebChat-clients blijven handmatig.
- Rol-, scope-, metadata- en publieke-sleutel-upgrades blijven handmatig.
- Same-host loopback trusted-proxy-headerpaden komen niet in aanmerking omdat dat
pad kan worden gespooft door lokale aanroepers.
Wanneer een al gekoppeld apparaat opnieuw verbinding maakt met alleen niet-gevoelige metadata
wijzigingen (bijvoorbeeld weergavenaam of hints voor clientplatform), behandelt OpenClaw
dat als een metadata-upgrade. Stille automatische goedkeuring is smal: deze geldt alleen
voor vertrouwde niet-browser lokale herverbindingen die al bezit van lokale
of gedeelde referenties hebben bewezen, inclusief same-host native app-herverbindingen na OS
versie-metadatawijzigingen. Browser-/Control UI-clients en externe clients gebruiken nog steeds
de expliciete hergoedkeuringsflow. Scope-upgrades (lezen naar schrijven/admin) en
publieke-sleutelwijzigingen komen niet in aanmerking voor automatische goedkeuring van metadata-upgrades -
ze blijven expliciete hergoedkeuringsverzoeken.
QR-koppelingshelpers
/pair qr rendert de koppelingspayload als gestructureerde media zodat mobiele en
browserclients deze direct kunnen scannen.
Het verwijderen van een apparaat ruimt ook alle verouderde wachtende koppelingsverzoeken voor dat
apparaat-id op, zodat nodes pending na een intrekking geen verweesde rijen toont.
Gateway-koppeling behandelt een verbinding alleen als loopback wanneer zowel de ruwe socket
als eventueel upstream-proxybewijs overeenkomen. Als een verzoek op loopback binnenkomt maar
Forwarded, een X-Forwarded-*- of X-Real-IP-headerbewijs bevat, diskwalificeert dat
doorgestuurde-headerbewijs de loopback-localiteitsclaim. Het koppelingspad
vereist dan expliciete goedkeuring in plaats van het verzoek stilzwijgend als een
same-host-verbinding te behandelen. Zie Vertrouwde-proxy-auth voor
de equivalente regel voor operator-auth.
Opslag (lokaal, privé)
Koppelingsstatus wordt opgeslagen onder de Gateway-statusdirectory (standaard ~/.openclaw):
~/.openclaw/nodes/paired.json
~/.openclaw/nodes/pending.json
Als je OPENCLAW_STATE_DIR overschrijft, verhuist de map nodes/ mee.
Beveiligingsnotities:
- Tokens zijn geheimen; behandel
paired.json als gevoelig.
- Rotatie van een token vereist hergoedkeuring (of verwijdering van de node-vermelding).
Transportgedrag
- Het transport is stateless; het slaat geen lidmaatschap op.
- Als de Gateway offline is of koppeling is uitgeschakeld, kunnen nodes niet koppelen.
- Als de Gateway in externe modus staat, gebeurt koppeling nog steeds tegen de opslag van de externe Gateway.
Gerelateerd