Zum Artikel springen
PlanToCodeDocsApp herunterladen

HandbuchRelay & Konten

Konten, Authentifizierung und Regionen

Die Auth0-PKCE-Übergabe über Redis, das PlanToCode-JWT und seine Erneuerung, was ein Regionswechsel ungültig macht, wie ChatGPT-Profile zu Transkripten stehen, und welche Daten Ihren Computer verlassen.

Gegen den Quellcode geprüft am 17. September 2026

Auf dieser Seite

Wie die native Anmeldung zurück in die App kommt

Der Browser parkt den Code beim regionalen Server, und nur die abfragende App kann ihn einlösen
Der Browser parkt den Code beim regionalen Server, und nur die abfragende App kann ihn einlösenDie Zeit läuft von links nach rechts. Die App öffnet den Browser bei initiate-login des regionalen Servers, das einen State-Schlüssel in Redis speichert und zu Auth0 weiterleitet. Die App beginnt sofort mit dem Abfragen und erhält 204, während die Anmeldung läuft. Auth0 schickt den Browser mit dem Code zum Callback. Der Callback verbraucht den State-Schlüssel und parkt den Code unter der Polling-ID der App, sodass ein wiederholter Callback 401 erhält. Eine Abfrage liest den geparkten Code, ohne ihn zu verbrauchen, sodass nach einer verlorenen Antwort die nächste Abfrage denselben Code erhält. Die App löst den Code einmal mit ihrem Verifier bei Auth0 ein und ruft dann finalize-login auf, das das PlanToCode-JWT zurückgibt und den Poll-Schlüssel löscht. Nichts läuft vom Browser zur App.
AppDesktop oder Telefon
Browser
Auth0
Regionale APISchlüssel in Redis
State-Schlüssel
Poll-Schlüssel
Anmeldung
pid · csrf
Code · csrf, SET NX
fragt von Anfang an ab: 204, bis der Code geparkt ist
öffnet initiate-login mit Challenge, pid, csrf
Antwort verloren
Callback mit dem Code
verbraucht
Code + Verifier, einmal
finalize-login: JWT zurück
gelöscht
wiederholter Callback: 401
Die App gibt nach höchstens 60 Abfragen auf, nach etwa 2 bis 2,5 Minuten. Ein später geparkter Code verfällt nach 30 Minuten ungenutzt.
Nichts läuft vom Browser zur App, und der Verifier verlässt die App nur in Richtung Auth0.
  • State-Schlüsselauth0:state:{state}

    Von initiate-login mit Polling-ID und CSRF-Token geschrieben und vom Callback gelöscht, sobald er den Code parkt. Ein wiederholter Callback findet nichts und erhält 401.

  • Poll-Schlüsselauth0:poll:{pid} · SET NX

    Abfragen lesen ihn, ohne ihn zu verbrauchen, sodass nach einer verlorenen Antwort die nächste Abfrage denselben Code erhält. finalize-login löscht ihn nach dem Ausstellen des JWT, und beide Schlüssel laufen nach 30 Minuten ab.

  • AbfragenGET /auth0/poll-status

    Telefone fragen alle 2 Sekunden ab, bis zu 60-mal. Der Desktop fragt etwa eine Minute lang alle 2 Sekunden ab, danach alle 3, und hört nach 60 Abfragen oder 150 Sekunden auf.

  • Verifiercode_verifier

    Wird mit der Polling-ID erzeugt und im Arbeitsspeicher der App gehalten. Nur der Token-Endpunkt von Auth0 erhält ihn, einmal, sodass ein geparkter oder abgefangener Code ohne ihn nutzlos ist.

Ihr Gerät übergibt die Auth0-Tokens einmal dem Server und behält ein PlanToCode-JWT
Ihr Gerät übergibt die Auth0-Tokens einmal dem Server und behält ein PlanToCode-JWTBei der Anmeldung tauscht die App den Code bei Auth0 gegen ein Zugriffstoken und ein Refresh-Token ein, sendet beide einmal an finalize-login und behält keines davon. Der regionale Server speichert das Refresh-Token verschlüsselt und tauscht es selbst bei Auth0 ein, sobald ein Gerät erneuert. Jedes Gerät behält sein eigenes PlanToCode-JWT, 7 Tage gültig und bis 24 Stunden nach dem Ablauf erneuerbar. Die ChatGPT-Anmeldung bleibt im Profilordner des Desktops, wo das Codex-Kind sie für jeden Agent-Turn nutzt. Telefone erhalten über das Relay nur Name, E-Mail, Plan und Nutzungslimits.
Auth0
Ihre Geräte
Regionaler Server
Auth0-Tokens: einmal genutzt, nicht behalten
PlanToCode-JWTSchlüsselbund oder Keystore, je Gerät
ChatGPT-AnmeldungProfilordner des Desktops
Auth0-Refresh-TokenTabelle users, AES-256-GCM
OpenAI
Zugriffs- und Refresh-Token, einmal
Refresh-Token gegen neue Tokens, je Erneuerung
finalize-login, einmal
neues JWT pro Gerät
Erneuerung mit dem JWT
Lebensdauer des PlanToCode-JWT
7 Tage gültig
24 h Gnadenfrist: Erneuerung geht noch
Name, E-Mail, Plan, Limits
das Relay reicht sie an Telefone weiter
jeder Agent-Turn, über das Codex-Kind
  • Zugriffstokenfinalize-login · auth0_id_token

    Die App erhält es aus ihrem eigenen Code-Austausch und sendet es einmal an finalize-login, in einem Feld, das noch auth0_id_token heißt. Der Server prüft es, holt damit userinfo und speichert es nirgends.

  • Refresh-Tokenusers.auth0_refresh_token

    Läuft einmal durch die App. Der Server speichert es verschlüsselt, tauscht es mit seinen eigenen Client-Zugangsdaten bei Auth0 ein und behält das rotierte Token, auch wenn die neuen Tokens danach die Prüfung nicht bestehen.

  • PlanToCode-JWTJWT_ACCESS_TOKEN_DURATION_DAYS = 7

    Pro Gerät mit einem device_id-Claim ausgestellt. Bis zu 24 Stunden nach dem Ablauf tauscht refresh-app-token es noch gegen ein neues. Danach ist eine neue Anmeldung nötig.

  • ChatGPT-Anmeldungcodex --auth-home

    Entsteht durch die eigene Anmeldung des Codex-Kinds und liegt im Profilordner des Desktops, den es liest. Telefone erhalten über das Relay Name, E-Mail, Plan und Nutzungslimits des Profils, nie die Anmeldung selbst.

HTTP-EinstiegspunktZweck
GET /auth/auth0/initiate-loginAccount-Login initiieren.
GET /auth/auth0/callbackAuth0 leitet den Browser hierher. Den Code parken und den Browser auf eine Bestätigungsseite schicken.
GET /auth0/poll-statusNicht konsumierende Abfrage; 204 mit Cache-Control: no-store, bis der Code geparkt ist.
POST /auth0/finalize-loginAuth0-Token und Client-ID prüfen, eine verifizierte E-Mail verlangen, das PlanToCode-JWT ausstellen, das Erstanmeldeguthaben gewähren und dann den Poll-Schlüssel löschen.
POST /api/auth0/refresh-app-tokenDas PlanToCode-App-Token erneuern. Die einzige Route, die ein abgelaufenes Token akzeptiert.

Das Verbrauchen des State-Schlüssels und das Löschen des Poll-Schlüssels laufen jeweils als ein Lua-Skript in Redis. Der Speicher ist Redis statt Arbeitsspeicher, weil jeder API-Prozess der Region ihn teilt.

Das PlanToCode-JWT ist HS256 mit gemeinsamem Geheimnis, Aussteller plantocode, Zielgruppe plantocode-api und Scope read write rpc. Seine jti wird bei jeder Anfrage und erneut beim WebSocket-Upgrade gegen eine Sperrtabelle geprüft, sein device_id-Claim wird mit dem X-Device-ID-Header verglichen, und es lebt standardmäßig 7 Tage. Die Erneuerungsroute akzeptiert ein Token noch bis zu 24 Stunden nach seinem Ablauf, wobei Aussteller, Zielgruppe, Gerätebindung, Scopes und Sperrung weiter durchgesetzt werden, läuft in einer pro Benutzer serialisierten Transaktion und verweigert ein neues Token, wenn Auth0-Subject oder E-Mail nicht mehr zum gespeicherten Benutzer passen. Das WebSocket-Upgrade erfasst vor seiner Sperrprüfung eine Registrierungssperre pro Benutzer, sodass eine Abmeldung, die zwischen HTTP-Prüfung und Relay-Registrierung abschließt, die Registrierung ungültig macht.

Das optionale Server-Client-Credential-Paar des Servers wird für den serverseitigen Auth0-Refresh-Austausch benötigt. Konfigurieren Sie die Auth0-Domäne, die native Client-ID, die Audience und die Callback-Einstellungen der nativen App gemeinsam. Die ausgewählte API-Region und die iOS-authServerURL sind unterschiedliche Konfigurationspfade, prüfen Sie also beide beim Einrichten einer lokalen Umgebung.

Was ein Regionswechsel oder eine Abmeldung ungültig macht

Ein Regionswechsel oder eine Abmeldung beendet den vorherigen Versuch und löscht seine Zugangsdaten. Ein spätes Ergebnis eines alten Versuchs kann kein Konto wiederherstellen, weil jedes Ergebnis an den Versuch und den Ursprung gebunden ist, die es gestartet haben.

Anmeldung, Abmeldung, Token-Erneuerung und Sitzungsabstimmung auf dem Desktop teilen eine Mutationssperre, und die Abstimmung verwirft Ergebnisse, wenn sich Token oder Ursprung während einer Anfrage geändert haben. Callback-Wiederholung wird abgewiesen, und die Übergabebestätigung ist idempotent.

Lokale Ausführung nutzt trotzdem entfernte Dienste

Tools und Dateiänderungen laufen auf dem Desktop, und eine Modellanfrage sendet den Aufgabenkontext trotzdem an OpenAI. Die mobile Steuerung sendet Anfragen und den zurückgegebenen Workspace-Inhalt über den regionalen Server. Das Diktat sendet eine Aufnahme an den von Ihnen konfigurierten Transkriptionsdienst, und die Gemini-Tools des Agenten senden Text oder Video unter Ihrem Schlüssel an Gemini.

„Desktop-eigen“ beschreibt also, wo Ausführung und Dateien leben. Es ist weder ein Offline-Modus noch ein Versprechen von Ende-zu-Ende-Verschlüsselung.