Gateway-Protokoll (WebSocket)
Das Gateway-WS-Protokoll ist die einzige Control-Plane + der einzige Node-Transport für OpenClaw. Alle Clients (CLI, Web-UI, macOS-App, iOS-/Android-Nodes, Headless- Nodes) verbinden sich über WebSocket und deklarieren ihre Rolle + ihren Scope zur Handshake-Zeit.Transport
- WebSocket, Text-Frames mit JSON-Payloads.
- Der erste Frame muss eine Anfrage
connectsein.
Handshake (connect)
Gateway → Client (Pre-Connect-Challenge):hello-ok außerdem:
hello-ok.auth zusätzlich weitere
begrenzte Rolleneinträge in deviceTokens enthalten:
scopes: [], und jedes übergebene Operator-Token bleibt auf die Bootstrap-
Operator-Allowlist begrenzt (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Bootstrap-Scope-Prüfungen bleiben
rollenpräfixiert: Operator-Einträge erfüllen nur Operator-Anfragen, und Nicht-Operator-
Rollen benötigen weiterhin Scopes unter ihrem eigenen Rollenpräfix.
Node-Beispiel
Framing
- Anfrage:
{type:"req", id, method, params} - Antwort:
{type:"res", id, ok, payload|error} - Ereignis:
{type:"event", event, payload, seq?, stateVersion?}
Rollen + Scopes
Rollen
operator= Control-Plane-Client (CLI/UI/Automatisierung).node= Capability-Host (camera/screen/canvas/system.run).
Scopes (operator)
Häufige Scopes:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config mit includeSecrets: true erfordert operator.talk.secrets
(oder operator.admin).
Per Plugin registrierte Gateway-RPC-Methoden können ihren eigenen Operator-Scope anfordern, aber
reservierte Core-Admin-Präfixe (config.*, exec.approvals.*, wizard.*,
update.*) werden immer zu operator.admin aufgelöst.
Der Methodenscope ist nur das erste Gate. Einige Slash-Befehle, die über
chat.send erreicht werden, wenden zusätzlich strengere Prüfungen auf Befehlsebene an. Zum Beispiel erfordern persistente
Schreibvorgänge von /config set und /config unset operator.admin.
node.pair.approve hat zusätzlich zur Basis-Scope-Prüfung der Methode eine weitere
Prüfung zur Genehmigungszeit:
- Anfragen ohne Befehl:
operator.pairing - Anfragen mit Nicht-Exec-Node-Befehlen:
operator.pairing+operator.write - Anfragen, die
system.run,system.run.prepareodersystem.whichenthalten:operator.pairing+operator.admin
Caps/commands/permissions (node)
Nodes deklarieren Capability-Claims beim Verbindungsaufbau:caps: Kategorien auf hoher Ebene für Capabilities.commands: Allowlist von Befehlen für invoke.permissions: granulare Schalter (z. B.screen.record,camera.capture).
Presence
system-presencegibt Einträge zurück, die nach der Geräteidentität indiziert sind.- Presence-Einträge enthalten
deviceId,rolesundscopes, sodass UIs eine einzelne Zeile pro Gerät anzeigen können, selbst wenn es sowohl als operator als auch als node verbunden ist.
Häufige RPC-Methodenfamilien
Diese Seite ist kein generierter vollständiger Dump, aber die öffentliche WS-Oberfläche ist breiter als die obigen Handshake-/Auth-Beispiele. Dies sind die wichtigsten Methodenfamilien, die das Gateway heute bereitstellt.hello-ok.features.methods ist eine konservative Discovery-Liste, die aus
src/gateway/server-methods-list.ts plus geladenen Plugin-/Kanal-Methodenexports aufgebaut wird.
Behandeln Sie sie als Feature-Discovery, nicht als generierten Dump aller aufrufbaren Hilfsfunktionen,
die in src/gateway/server-methods/*.ts implementiert sind.
System und Identität
healthgibt den gecachten oder frisch geprüften Gateway-Health-Snapshot zurück.statusgibt die Gateway-Zusammenfassung im Stil von/statuszurück; sensible Felder werden nur für admin-scoped Operator-Clients eingeschlossen.gateway.identity.getgibt die Gateway-Geräteidentität zurück, die von Relay- und Pairing-Abläufen verwendet wird.system-presencegibt den aktuellen Presence-Snapshot für verbundene Operator-/Node-Geräte zurück.system-eventhängt ein Systemereignis an und kann den Presence- Kontext aktualisieren/broadcasten.last-heartbeatgibt das zuletzt persistierte Heartbeat-Ereignis zurück.set-heartbeatsschaltet die Heartbeat-Verarbeitung auf dem Gateway um.
Modelle und Nutzung
models.listgibt den zur Laufzeit erlaubten Modellkatalog zurück.usage.statusgibt Zusammenfassungen von Provider-Nutzungsfenstern/verbleibendem Kontingent zurück.usage.costgibt aggregierte Kosten-Nutzungszusammenfassungen für einen Datumsbereich zurück.doctor.memory.statusgibt die Bereitschaft von Vector-Memory/Embeddings für den aktiven Standard-Agent-Workspace zurück.sessions.usagegibt Nutzungszusammenfassungen pro Sitzung zurück.sessions.usage.timeseriesgibt Zeitreihennutzung für eine Sitzung zurück.sessions.usage.logsgibt Usage-Log-Einträge für eine Sitzung zurück.
Kanäle und Login-Hilfsfunktionen
channels.statusgibt Statuszusammenfassungen für integrierte und gebündelte Kanäle/Plugins zurück.channels.logoutmeldet einen bestimmten Kanal/Account ab, sofern der Kanal Logout unterstützt.web.login.startstartet einen QR-/Web-Login-Ablauf für den aktuellen QR-fähigen Web- Kanal-Provider.web.login.waitwartet darauf, dass dieser QR-/Web-Login-Ablauf abgeschlossen wird, und startet den Kanal bei Erfolg.push.testsendet einen Test-APNs-Push an einen registrierten iOS-Node.voicewake.getgibt die gespeicherten Wake-Word-Trigger zurück.voicewake.setaktualisiert Wake-Word-Trigger und broadcastet die Änderung.
Messaging und Logs
sendist das direkte RPC für ausgehende Zustellung für Kanal-/Account-/Thread-gezielte Sends außerhalb des Chat-Runners.logs.tailgibt den konfigurierten Gateway-Datei-Log-Tail mit Cursor/Limit und Max-Byte-Steuerung zurück.
Talk und TTS
talk.configgibt die effektive Talk-Konfigurations-Payload zurück;includeSecretserfordertoperator.talk.secrets(oderoperator.admin).talk.modesetzt/broadcastet den aktuellen Talk-Modus-Status für WebChat-/Control-UI- Clients.talk.speaksynthetisiert Sprache über den aktiven Talk-Speech-Provider.tts.statusgibt TTS-Aktivierungsstatus, aktiven Provider, Fallback-Provider und Provider-Konfigurationsstatus zurück.tts.providersgibt das sichtbare TTS-Provider-Inventar zurück.tts.enableundtts.disableschalten den TTS-Präferenzstatus um.tts.setProvideraktualisiert den bevorzugten TTS-Provider.tts.convertführt eine einmalige Text-zu-Sprache-Konvertierung aus.
Secrets, Konfiguration, Update und Wizard
secrets.reloadlöst aktive SecretRefs erneut auf und tauscht den Laufzeit-Secret-Status nur bei vollständigem Erfolg aus.secrets.resolvelöst Secret-Zuweisungen für Befehlsziele für einen bestimmten Satz aus Befehl/Ziel auf.config.getgibt den aktuellen Konfigurations-Snapshot und Hash zurück.config.setschreibt eine validierte Konfigurations-Payload.config.patchführt ein Merge einer partiellen Konfigurationsaktualisierung durch.config.applyvalidiert und ersetzt die vollständige Konfigurations-Payload.config.schemagibt die Live-Konfigurations-Schema-Payload zurück, die von Control UI und CLI-Tooling verwendet wird: Schema,uiHints, Version und Generierungsmetadaten, einschließlich Plugin- + Kanal-Schema-Metadaten, wenn die Laufzeit sie laden kann. Das Schema enthält Feldmetadatentitle/description, die aus denselben Labels und Hilfetexten abgeleitet sind, die von der UI verwendet werden, einschließlich verschachtelter Objekt-, Wildcard-, Array-Item- undanyOf/oneOf/allOf-Kompositionszweige, wenn passende Felddokumentation existiert.config.schema.lookupgibt eine pfadbezogene Lookup-Payload für einen Konfigurations- pfad zurück: normalisierter Pfad, ein flacher Schemaknoten, passender Hint +hintPathund unmittelbare Zusammenfassungen von Kindknoten für UI-/CLI-Drill-down.- Lookup-Schemaknoten behalten die benutzerseitige Dokumentation und gängige Validierungsfelder:
title,description,type,enum,const,format,pattern, numerische/String-/Array-/Objekt-Grenzen und boolesche Flags wieadditionalProperties,deprecated,readOnly,writeOnly. - Zusammenfassungen von Kindknoten zeigen
key, normalisiertenpath,type,required,hasChildrensowie den passendenhint/hintPath.
- Lookup-Schemaknoten behalten die benutzerseitige Dokumentation und gängige Validierungsfelder:
update.runführt den Gateway-Update-Ablauf aus und plant einen Neustart nur dann, wenn das Update selbst erfolgreich war.wizard.start,wizard.next,wizard.statusundwizard.cancelstellen den Onboarding-Wizard über WS RPC bereit.
Bestehende Hauptfamilien
Agent- und Workspace-Hilfsfunktionen
agents.listgibt konfigurierte Agent-Einträge zurück.agents.create,agents.updateundagents.deleteverwalten Agent-Datensätze und Workspace-Verdrahtung.agents.files.list,agents.files.getundagents.files.setverwalten die Bootstrap-Workspace-Dateien, die für einen Agent bereitgestellt werden.agent.identity.getgibt die effektive Assistant-Identität für einen Agent oder eine Sitzung zurück.agent.waitwartet darauf, dass eine Ausführung abgeschlossen wird, und gibt den Terminal-Snapshot zurück, wenn verfügbar.
Sitzungssteuerung
sessions.listgibt den aktuellen Sitzungsindex zurück.sessions.subscribeundsessions.unsubscribeschalten Sitzungsänderungs- Event-Subscriptions für den aktuellen WS-Client um.sessions.messages.subscribeundsessions.messages.unsubscribeschalten Transcript-/Nachrichten-Event-Subscriptions für eine Sitzung um.sessions.previewgibt begrenzte Transcript-Vorschauen für bestimmte Sitzungsschlüssel zurück.sessions.resolvelöst ein Sitzungsziel auf oder kanonisiert es.sessions.createerstellt einen neuen Sitzungseintrag.sessions.sendsendet eine Nachricht in eine bestehende Sitzung.sessions.steerist die Variante zum Unterbrechen und Steuern für eine aktive Sitzung.sessions.abortbricht aktive Arbeit für eine Sitzung ab.sessions.patchaktualisiert Sitzungsmetadaten/-überschreibungen.sessions.reset,sessions.deleteundsessions.compactführen Sitzungs- Wartung aus.sessions.getgibt die vollständig gespeicherte Sitzungszeile zurück.- Chat-Ausführung verwendet weiterhin
chat.history,chat.send,chat.abortundchat.inject. chat.historyist für UI-Clients anzeigebereinigt normalisiert: Inline-Direktiven-Tags werden aus sichtbarem Text entfernt, Klartext-XML-Payloads für Tool-Aufrufe (einschließlich<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>und abgeschnittener Tool-Call-Blöcke) sowie geleakte ASCII-/vollbreite Modell- Control-Tokens werden entfernt, reine Assistant-Zeilen mit Silent-Token wie genauNO_REPLY/no_replywerden ausgelassen, und übergroße Zeilen können durch Platzhalter ersetzt werden.
Device-Pairing und Device-Tokens
device.pair.listgibt ausstehende und genehmigte gekoppelte Geräte zurück.device.pair.approve,device.pair.rejectunddevice.pair.removeverwalten Device-Pairing-Datensätze.device.token.rotaterotiert ein gekoppeltes Device-Token innerhalb seiner genehmigten Rollen- und Scope-Grenzen.device.token.revokewiderruft ein gekoppeltes Device-Token.
Node-Pairing, Invoke und Pending Work
node.pair.request,node.pair.list,node.pair.approve,node.pair.rejectundnode.pair.verifydecken Node-Pairing und Bootstrap- Verifikation ab.node.listundnode.describegeben bekannten/verbundenen Node-Status zurück.node.renameaktualisiert ein Label für einen gekoppelten Node.node.invokeleitet einen Befehl an einen verbundenen Node weiter.node.invoke.resultgibt das Ergebnis einer Invoke-Anfrage zurück.node.eventtransportiert von Nodes stammende Ereignisse zurück ins Gateway.node.canvas.capability.refreshaktualisiert scoped Canvas-Capability-Tokens.node.pending.pullundnode.pending.acksind die Queue-APIs für verbundene Nodes.node.pending.enqueueundnode.pending.drainverwalten dauerhafte Pending-Work für Offline-/getrennte Nodes.
Genehmigungsfamilien
exec.approval.requestundexec.approval.resolvedecken einmalige Exec- Genehmigungsanfragen ab.exec.approval.waitDecisionwartet auf eine ausstehende Exec-Genehmigung und gibt die endgültige Entscheidung zurück (odernullbei Timeout).exec.approvals.getundexec.approvals.setverwalten Snapshots der Gateway-Exec- Genehmigungsrichtlinie.exec.approvals.node.getundexec.approvals.node.setverwalten Node-lokale Exec- Genehmigungsrichtlinien über Node-Relay-Befehle.plugin.approval.request,plugin.approval.waitDecisionundplugin.approval.resolvedecken plugin-definierte Genehmigungsabläufe ab.
Andere Hauptfamilien
- Automatisierung:
wakeplant eine sofortige oder zum nächsten Heartbeat erfolgende Wake-Text-Injektioncron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- Skills/Tools:
skills.*,tools.catalog,tools.effective
Häufige Ereignisfamilien
chat: UI-Chat-Updates wiechat.injectund andere nur-Transcript-Chat- Ereignisse.session.messageundsession.tool: Transcript-/Event-Stream-Updates für eine abonnierte Sitzung.sessions.changed: Sitzungsindex oder Metadaten haben sich geändert.presence: Updates des System-Presence-Snapshots.tick: periodisches Keepalive-/Liveness-Ereignis.health: Update des Gateway-Health-Snapshots.heartbeat: Update des Heartbeat-Ereignisstreams.cron: Ereignisänderung eines Cron-Laufs/Cron-Jobs.shutdown: Gateway-Shutdown-Benachrichtigung.node.pair.requested/node.pair.resolved: Lebenszyklus von Node-Pairing.node.invoke.request: Broadcast einer Node-Invoke-Anfrage.device.pair.requested/device.pair.resolved: Lebenszyklus gekoppelter Geräte.voicewake.changed: Konfiguration der Wake-Word-Trigger wurde geändert.exec.approval.requested/exec.approval.resolved: Lebenszyklus von Exec- Genehmigungen.plugin.approval.requested/plugin.approval.resolved: Lebenszyklus von Plugin- Genehmigungen.
Node-Hilfsmethoden
- Nodes können
skills.binsaufrufen, um die aktuelle Liste von Skill-Executables für Auto-Allow-Prüfungen abzurufen.
Operator-Hilfsmethoden
- Operators können
tools.catalog(operator.read) aufrufen, um den Laufzeit-Tool-Katalog für einen Agent abzurufen. Die Antwort enthält gruppierte Tools und Provenance-Metadaten:source:coreoderpluginpluginId: Plugin-Owner, wennsource="plugin"optional: ob ein Plugin-Tool optional ist
- Operators können
tools.effective(operator.read) aufrufen, um das zur Laufzeit effektive Tool- Inventar für eine Sitzung abzurufen.sessionKeyist erforderlich.- Das Gateway leitet vertrauenswürdigen Laufzeitkontext serverseitig aus der Sitzung ab, anstatt vom Aufrufer bereitgestellten Auth- oder Zustellungskontext zu akzeptieren.
- Die Antwort ist auf die Sitzung begrenzt und spiegelt wider, was die aktive Unterhaltung aktuell verwenden kann, einschließlich Core-, Plugin- und Kanal-Tools.
- Operators können
skills.status(operator.read) aufrufen, um das sichtbare Skill-Inventar für einen Agent abzurufen.agentIdist optional; lassen Sie es weg, um den Standard-Agent-Workspace zu lesen.- Die Antwort enthält Eignung, fehlende Anforderungen, Konfigurationsprüfungen und bereinigte Installationsoptionen, ohne rohe Secret-Werte offenzulegen.
- Operators können
skills.searchundskills.detail(operator.read) für Discovery-Metadaten von ClawHub aufrufen. - Operators können
skills.install(operator.admin) in zwei Modi aufrufen:- ClawHub-Modus:
{ source: "clawhub", slug, version?, force? }installiert einen Skill-Ordner in dasskills/-Verzeichnis des Standard-Agent-Workspaces. - Gateway-Installer-Modus:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }führt eine deklarierte Aktionmetadata.openclaw.installauf dem Gateway-Host aus.
- ClawHub-Modus:
- Operators können
skills.update(operator.admin) in zwei Modi aufrufen:- Der ClawHub-Modus aktualisiert einen verfolgten Slug oder alle verfolgten ClawHub-Installationen im Standard-Agent-Workspace.
- Der Konfigurationsmodus patched Werte unter
skills.entries.<skillKey>wieenabled,apiKeyundenv.
Exec-Genehmigungen
- Wenn eine Exec-Anfrage Genehmigung benötigt, broadcastet das Gateway
exec.approval.requested. - Operator-Clients lösen dies auf, indem sie
exec.approval.resolveaufrufen (erfordert Scopeoperator.approvals). - Für
host=nodemussexec.approval.requestsystemRunPlanenthalten (kanonischeargv/cwd/rawCommand/Sitzungsmetadaten). Anfragen ohnesystemRunPlanwerden abgelehnt. - Nach der Genehmigung verwenden weitergeleitete
node.invoke system.run-Aufrufe dieses kanonischesystemRunPlanerneut als maßgeblichen Befehl-/cwd-/Sitzungskontext. - Wenn ein Aufrufer
command,rawCommand,cwd,agentIdodersessionKeyzwischenprepareund der endgültig genehmigten Weiterleitung vonsystem.runverändert, lehnt das Gateway die Ausführung ab, statt der veränderten Payload zu vertrauen.
Agent-Zustellungs-Fallback
agent-Anfragen könnendeliver=trueenthalten, um ausgehende Zustellung anzufordern.bestEffortDeliver=falsebehält striktes Verhalten bei: nicht auflösbare oder nur interne Zustellziele gebenINVALID_REQUESTzurück.bestEffortDeliver=trueerlaubt einen Fallback auf nur-Sitzungs-Ausführung, wenn keine extern zustellbare Route aufgelöst werden kann (zum Beispiel interne/WebChat-Sitzungen oder mehrdeutige Multi-Channel-Konfigurationen).
Versionierung
PROTOCOL_VERSIONbefindet sich insrc/gateway/protocol/schema.ts.- Clients senden
minProtocol+maxProtocol; der Server lehnt Abweichungen ab. - Schemas + Modelle werden aus TypeBox-Definitionen generiert:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Auth
- Gemeinsame Secret-Gateway-Authentifizierung verwendet
connect.params.auth.tokenoderconnect.params.auth.password, abhängig vom konfigurierten Auth-Modus. - Modi mit Identitätsbezug wie Tailscale Serve
(
gateway.auth.allowTailscale: true) oder Nicht-Loopback-gateway.auth.mode: "trusted-proxy"erfüllen die Connect-Auth-Prüfung aus Request-Headern statt ausconnect.params.auth.*. - Privater Ingress mit
gateway.auth.mode: "none"überspringt die Connect-Authentifizierung per Shared Secret vollständig; dieser Modus darf nicht über öffentlichen/nicht vertrauenswürdigen Ingress exponiert werden. - Nach dem Pairing gibt das Gateway ein Device-Token aus, das auf Verbindungs-
Rolle + Scopes begrenzt ist. Es wird in
hello-ok.auth.deviceTokenzurückgegeben und sollte vom Client für zukünftige Verbindungen persistiert werden. - Clients sollten das primäre
hello-ok.auth.deviceTokennach jeder erfolgreichen Verbindung persistieren. - Beim Wiederverbinden mit diesem gespeicherten Device-Token sollte auch der gespeicherte genehmigte Scope-Satz für dieses Token wiederverwendet werden. Dadurch bleibt bereits gewährter Lese-/Probe-/Status-Zugriff erhalten und es wird vermieden, dass Wiederverbindungen stillschweigend auf einen engeren impliziten reinen Admin-Scope zusammenfallen.
- Normale Connect-Auth-Priorität ist zuerst explizites Shared Token/Passwort, dann
explizites
deviceToken, dann gespeichertes Token pro Gerät, dann Bootstrap-Token. - Zusätzliche Einträge in
hello-ok.auth.deviceTokenssind Bootstrap-Übergabetokens. Persistieren Sie sie nur, wenn die Verbindung Bootstrap-Auth auf einem vertrauenswürdigen Transport wiewss://oder Loopback/lokal verwendet hat. - Wenn ein Client ein explizites
deviceTokenoder explizitescopesangibt, bleibt dieser vom Aufrufer angeforderte Scope-Satz maßgeblich; gecachte Scopes werden nur wiederverwendet, wenn der Client das gespeicherte gerätespezifische Token wiederverwendet. - Device-Tokens können über
device.token.rotateunddevice.token.revokerotiert/widerrufen werden (erfordert Scopeoperator.pairing). - Ausgabe/Rotation von Tokens bleibt auf den genehmigten Rollensatz begrenzt, der im Pairing-Eintrag des Geräts aufgezeichnet ist; das Rotieren eines Tokens kann das Gerät nicht in eine Rolle erweitern, die bei der Pairing-Genehmigung nie gewährt wurde.
- Für Sitzungen mit Token gekoppelter Geräte ist die Geräteverwaltung selbstbezogen, sofern der
Aufrufer nicht zusätzlich
operator.adminhat: Nicht-Admin-Aufrufer können nur ihren eigenen Geräteeintrag entfernen/widerrufen/rotieren. device.token.rotateprüft außerdem den angeforderten Operator-Scope-Satz gegen die aktuellen Sitzungsscopes des Aufrufers. Nicht-Admin-Aufrufer können ein Token nicht in einen breiteren Operator-Scope-Satz rotieren, als sie bereits besitzen.- Auth-Fehler enthalten
error.details.codeplus Hinweise zur Wiederherstellung:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Client-Verhalten bei
AUTH_TOKEN_MISMATCH:- Vertrauenswürdige Clients können einen begrenzten Retry mit einem gecachten gerätespezifischen Token versuchen.
- Wenn dieser Retry fehlschlägt, sollten Clients automatische Wiederverbindungsschleifen stoppen und Hinweise für Operator-Aktionen anzeigen.
Geräteidentität + Pairing
- Nodes sollten eine stabile Geräteidentität (
device.id) einschließen, die von einem Fingerabdruck eines Schlüsselpaares abgeleitet ist. - Gateways geben Tokens pro Gerät + Rolle aus.
- Pairing-Genehmigungen sind für neue Geräte-IDs erforderlich, sofern lokale Auto-Genehmigung nicht aktiviert ist.
- Die Auto-Genehmigung beim Pairing ist auf direkte lokale Loopback-Verbindungen konzentriert.
- OpenClaw hat außerdem einen engen Self-Connect-Pfad für vertrauenswürdige Shared-Secret-Helper-Abläufe im Backend/Container-lokal.
- Verbindungen über Tailnet oder LAN auf demselben Host werden weiterhin als remote behandelt und erfordern Genehmigung.
- Alle WS-Clients müssen während
connecteine Geräteidentität einschließen (operator + node). Control UI kann sie nur in diesen Modi weglassen:gateway.controlUi.allowInsecureAuth=truefür localhost-only inkompatibilitätsfreundliches unsicheres HTTP.- erfolgreiche Operator-Control-UI-Authentifizierung mit
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(Break-Glass, starke Sicherheitsabstufung).
- Alle Verbindungen müssen die vom Server bereitgestellte
connect.challenge-Nonce signieren.
Migrationsdiagnostik für Device-Auth
Für Legacy-Clients, die noch Signaturverhalten vor der Challenge verwenden, gibtconnect jetzt
DEVICE_AUTH_*-Detailcodes unter error.details.code mit einem stabilen error.details.reason zurück.
Häufige Migrationsfehler:
| Meldung | details.code | details.reason | Bedeutung |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | Client hat device.nonce weggelassen (oder leer gesendet). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Client hat mit einer veralteten/falschen Nonce signiert. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | Signatur-Payload stimmt nicht mit der v2-Payload überein. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | Signierter Zeitstempel liegt außerhalb des zulässigen Skews. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id stimmt nicht mit dem Fingerabdruck des Public Keys überein. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Format/Kanonisierung des Public Keys fehlgeschlagen. |
- Immer auf
connect.challengewarten. - Die v2-Payload signieren, die die Server-Nonce enthält.
- Dieselbe Nonce in
connect.params.device.noncesenden. - Bevorzugte Signatur-Payload ist
v3, das zusätzlich zu Device-/Client-/Rolle-/Scopes-/Token-/Nonce-Feldern auchplatformunddeviceFamilybindet. - Legacy-
v2-Signaturen bleiben aus Kompatibilitätsgründen akzeptiert, aber das Pinning von Metadaten gekoppelter Geräte steuert weiterhin die Befehlsrichtlinie bei Wiederverbindungen.
TLS + Pinning
- TLS wird für WS-Verbindungen unterstützt.
- Clients können optional den Zertifikats-Fingerprint des Gateways pinnen (siehe Konfiguration
gateway.tlsplusgateway.remote.tlsFingerprintoder CLI--tls-fingerprint).
Umfang
Dieses Protokoll stellt die vollständige Gateway-API bereit (Status, Kanäle, Modelle, Chat, Agent, Sitzungen, Nodes, Genehmigungen usw.). Die genaue Oberfläche ist durch die TypeBox-Schemas insrc/gateway/protocol/schema.ts definiert.