OpenAI-MCP-App: OAuth- und 24h-Lernsession-Bindung
Generated artifact. Do not edit manually.
Generated by:
scripts/build_compendia.pyRegenerate with:python3 scripts/build_compendia.py --compendium runtime-workflows --web-and-texSource of truth:docs/concept/runtime-workflows/source/
Sprache / Language: Deutsch (DE) · English (EN) | PDF: Deutsches PDF · English PDF
Kompendium: §1 Personalisierung · §2 Lernablauf · §3 SRS-Sync · §4 Import/Export · §5 Portabler Host · §6 Kommunikationsvertrag · §7 Coach-Topologie · §8 OAuth & Session · §9 Verhaltensintegration · §10 Plugin-Lifecycle
8. OpenAI-MCP-App: OAuth- und 24h-Lernsession-Bindung
Geltungsbereich und Stand
Verbindliche Identitäts- und Sitzungsbindung des mehrsprachigen OpenAI-MCP-Coaches (SkillPilot Coach / skillpilot-coach auf https://mcp-openai.skillpilot.com/mcp gemäß der Entscheidung vom 19. Oktober 2026 in 10.1; historisch skillpilot-coach-v1 auf https://mcp-coach-v1.skillpilot.com/mcp in der unverändert archivierten Git-Beta 1.1.2). Für Plugin-Identität, Contract-Major und Lebenszyklus gilt ergänzend 10.
8.1. Architekturentscheidung: Zwei getrennte Berechtigungen
SkillPilot trennt App-Authentisierung und Lernendenadressierung strikt in zwei unabhängige Nachweise:
- OAuth authentisiert und autorisiert die MCP-Integration: Die gehostete Verzeichnis-App nutzt genau einen vorregistrierten vertraulichen OAuth-Client (
client_id+ langes zufälligesclient_secretviaclient_secret_basicam Token-Endpunkt, Authorization Code + PKCES256). Für den autorisierten nativen Desktop-Pfad existiert daneben ausschließlich das exakt gepinnte öffentliche CIMD-Profil (https://chatgpt.com/oauth/codex/7yTcOAOqrumX/client.json, Callbackhttp://127.0.0.1/callback/7yTcOAOqrumXmit dynamischem Port und PKCES256), niemals als Fallback einer fehlgeschlagenen vertraulichen Authentisierung. - Eine temporäre 24h-Lernsession wählt Lernenden und Interaktionssprache: Erst ein ausdrücklich bestätigtes Lernen starten im First-Party-WebGUI erzeugt eine neue opake
learningSessionId(PT24H) und öffnet einen neuen Chat. Die Zuordnung zur permanenten SkillPilot-ID und zurcommunicationLocalebleibt ausschließlich im Backend.
Für jeden fachlichen MCP-Toolaufruf müssen beide Bedingungen gleichzeitig erfüllt sein:
gueltiges OAuth Access Token (exakte Resource + Read/Write-Scope)
AND
gueltige learningSessionId (aktiv + Restlaufzeit >= PT1H)
OAuth allein erzeugt weder eine Lernsession noch wählt es einen Lernenden aus; eine learningSessionId allein autorisiert keinen MCP-Aufruf.
| Bindung | Transport | Serverseitige Bedeutung |
|---|---|---|
| ChatGPT/App -> SkillPilot | OAuth-Code-Flow (client_secret_basic bzw. gepinntes Desktop-CIMD + PKCE S256), danach Authorization: Bearer |
Genau das freigegebene Clientprofil darf ein auf die aktive MCP-Resource ausgestelltes Access Token beziehen und einlösen. |
| Chat -> Session -> Lernender | learningSessionId als Pflichtargument jedes fachlichen MCP-Tools |
Diese gültige, im First-Party-WebGUI gestartete Session adressiert genau einen Lernendenzustand samt communicationLocale. |
Die permanente SkillPilot-ID verlässt das Backend im MCP-Fluss niemals und erscheint weder im Chat noch in Toolargumenten oder -antworten.
8.2. Verbindlicher Startablauf, Erneuerung und Diagnose-TTL
Jeder Klick auf Lernen starten im First-Party-WebGUI ist eine eigene atomare Startoperation:
- Das WebGUI kennt die gewählte SkillPilot-ID, die
communicationLocaleund den konfigurierten Level-2-/Level-3-Kontext. - Es sendet genau einen Startrequest an das SkillPilot-Backend.
- Das Backend wendet den typisierten Startkontext atomar auf den autoritativen Lernendenzustand an.
- Es erzeugt in genau diesem Augenblick eine neue kryptografisch zufällige
learningSessionId. - Es persistiert ausschließlich deren HMAC-Hash zusammen mit interner
learner_id,communication_locale,started_atund absolutemexpires_at. - Es liefert eine vorbereitete Startnachricht und die Ziel-URL zurück; das WebGUI öffnet den neuen Chat mit eingetragener Nachricht:
Use SkillPilot Coach and continue.
learningSessionId: sps_<zufaelliger opaker Wert>
- Jeder Start ist unabhängig: Jeder Startrequest erzeugt eine neue
learningSessionId— auch für denselben Lernenden, bei noch laufender älterer Session, bei geteiltem ChatGPT-Konto oder bestehender OAuth-Verbindung. Parallele Sessions bleiben unabhängig gültig; Nutzung verlängertexpires_atniemals. - Erneuerung ausschließlich über WebGUI: Ohne aktuelle Startnachricht ruft das Modell kein SkillPilot-Tool auf, sondern nennt lokalisiert
https://skillpilot.com/und den WebGUI-Startweg. Liefert ein ToolSESSION_REQUIRED,SESSION_RENEWAL_REQUIREDoderSESSION_VERSION_UNAVAILABLE, gibt der Coachinstructionunverändert aus (bzw. den exakten lokalisierten Eintrag ausinstructions) und ergänztstartUrlnur, falls noch nicht enthalten — ohne Fachantwort, ohne Wiederverwendung der alten Session und ohne OAuth-Neuverbindung. - Gegatete First-Party-Diagnose-TTL: Ausschließlich
POST /api/ui/learners/{skillpilotId}/openai/v1/launchakzeptiert optionaldiagnosticSessionTtlSeconds, sofernSKILLPILOT_OPENAI_COACH_V1_DIAGNOSTIC_SESSION_TTL_ENABLED=trueaktiv ist und der ganzzahlige Wert in3601..86400Sekunden liegt (nie überPT24H). Die Verkürzung (z. B.3660s für den Übergang unterPT1Hnach 1 Minute oder5400s für einen 90-Minuten-Soak) gilt isoliert für genau diese eine Session; jeder Request ohne Feld läuft automatisch wieder mitPT24H.
8.3. MCP-Validierungsreihenfolge, Aktionshorizont und Verbote
Das Modell übernimmt learningSessionId unverändert als einfaches Pflicht-Stringfeld in jeden fachlichen Toolaufruf (Längen- und Formatregeln bleiben serverseitig, um Halluzinationen zu vermeiden), während der Connector Authorization: Bearer <token> außerhalb des Modellkontexts überträgt. Das Backend prüft strikt in dieser 8-stufigen Reihenfolge:
- gültiges OAuth Access Token;
- exakte Resource/Audience (
https://mcp-openai.skillpilot.com/mcp) sowie erforderlicher Read- oder Write-Scope; - vorhandene, syntaktisch gültige
learningSessionId; - HMAC-basierte Auflösung in
openai_de_learning_session; - Prüfung auf Ablauf und Widerruf;
- Auflösung des autoritativen Lernendenzustands und Verfügbarkeit der gepinnten Contract-, Workflow- und Curriculumrevision;
- Restlaufzeit
expiresAt >= now + PT1Hfür jede Lese-, Schreib- oder Replay-Antwort (exaktPT1Hist zulässig; darunter Abbruch mitSESSION_RENEWAL_REQUIRED); - bei Writes Prüfung auf exakten idempotenten Replay (gleicher Toolname, kanonisch identische Argumente, identische
clientRequestId, verfügbare gepinnte Versionen undcompletedStateVersion == aktuelle Learner-Revision; bei inzwischen fortgeschrittener Revision endet der Aufruf mitSTATE_VERSION_CONFLICT).
Ausdrücklich verbotene Fallbacks: Eine fehlende oder ungültige learningSessionId darf niemals ersetzt werden durch ein OAuth-Subject, die „zuletzt erzeugte“ oder irgendeine andere Session desselben Lernenden, einen Pending Launch, eine im Chat genannte SkillPilot-ID oder eine beim OAuth-Callback implizit angelegte Session. OAuth-Callbacks, Token-Refreshes und MCP-Reconnects erzeugen, verlängern oder reaktivieren niemals eine Lernsession. Damit bleiben auch gemeinsame Familien- oder Schul-ChatGPT-Konten strikt getrennt.
8.4. Persistenzschema, OAuth-/mTLS-Härtung und Fehlerverhalten
Die Tabelle openai_de_learning_session bildet die alleinige Persistenzgrenze der kurzlebigen Sitzungsbindung (frühere OAuth-Subject-Schlüssel wurden verworfen):
| Spalte | Bedeutung |
|---|---|
token_hash |
HMAC-Hash der ausgegebenen learningSessionId (Klartext wird nie gespeichert) |
learner_id |
Serverinterne Fremdschlüsselreferenz auf den Lernendendatensatz |
communication_locale |
Beim Start fixierte Sprache für Backendnutzdaten und sichtbare Coachantworten |
started_at |
Zeitstempel des bestätigten Klicks auf Lernen starten |
expires_at |
Absolute Ablaufzeit (started_at + PT24H, bzw. + diagnosticSessionTtlSeconds im gegateten Test) |
OAuth-Clientsecrets liegen ausschließlich in der geschützten Provider- und Serverkonfiguration (nie in Repo, Browser, Prompts, Argumenten, Antworten oder Logs). Offene Dynamic Client Registration (DCR) und ungepinnte CIMD-Dokumente sind deaktiviert; die exakte Callback-Allowlist, PKCE S256, Resource/Audience und Scopes werden erzwungen. Zusätzlich prüft der dedizierte MCP-vHost das OpenAI-Clientzertifikat (observe-Modus während der Integration: fehlende Zertifikate passieren bis OAuth, ungültige werden abgewiesen; enforce-Modus für erzwungene Kette, clientAuth-EKU und Connector-SAN; siehe OpenAI-MCP-Clientbindung). mTLS ersetzt weder OAuth noch die Lernsession.
| Fehlersituation | Verbindliches Verhalten |
|---|---|
| OAuth fehlt / ungültig | Normale OAuth-Neuautorisierung durch den Host; erzeugt keine Lernsession |
learningSessionId fehlt / unbekannt / manipuliert / abgelaufen / widerrufen |
SESSION_REQUIRED; Coach gibt nur unveränderte instruction (ggf. mit startUrl) aus; keine Fachantwort, neuer WebGUI-Start + neuer Chat |
Restlaufzeit < PT1H |
SESSION_RENEWAL_REQUIRED (exakt PT1H bleibt gültig); neuer WebGUI-Start + neuer Chat |
| Gepinnte Workflow-/Curriculumrevision nicht verfügbar | SESSION_VERSION_UNAVAILABLE; fail-closed, neuer WebGUI-Start + neuer Chat |
| Write-Scope fehlt | Ablehnung vor jeder fachlichen Mutation |
| Startkontext nicht atomar anwendbar / ungültige Diagnose-TTL | Startrequest ablehnen; keine learningSessionId ausstellen |
8.5. Sicherheitsinvarianten und automatisierte Abnahmekriterien
Die Implementierung wahrt 17 Sicherheitsinvarianten: (1) serverseitige permanente SkillPilot-ID, (2) zufällige opake Session-IDs nur als HMAC-Hash, (3) absolute PT24H-Laufzeit außer im gegateten 3601..86400-Diagnosefall, (4) keine Laufzeitverlängerung durch Nutzung, (5) PT1H-Aktionshorizont für neue Operationen, (6) identischer PT1H- und Revisionsschutz für idempotente Write-Replays, (7) frische unabhängige Session je Start, (8) keine Lernendenwahl durch OAuth allein, (9) keine MCP-Autorisierung durch Session allein, (10) learningSessionId-Pflicht für alle Fachtools, (11) kein OAuth-Subject-Lookup/-Fallback, (12) unveränderte Skill-Graph-/Frontier-/Mastery-Semantik, (13) strikte Clientprofil-Trennung (client_secret_basic bzw. exakt gepinntes Desktop-CIMD ohne Fallback), (14) Secret-Freiheit aller Artefakte/Logs, (15) feste sessiongebundene communicationLocale, (16) Pflicht zu erfolgreichem get_skillpilot_context zu Beginn jedes Learner-Turns und direkter Nutzung des Mutations-Nachfolgerzustands im selben Turn sowie (17) Verbleib von permanenter ID, Providerhinweis und Level-2-Konfiguration im First-Party-WebGUI.
Automatisierte Tests müssen alle 20 Abnahmekriterien belegen:
- Ein Klick auf Lernen starten erzeugt genau einen Startrequest und öffnet den Chat.
- Jeder Start erzeugt eine neue
learningSessionId, auch für denselben Lernenden. - Parallele Sessions verschiedener Lernender laufen kollisionsfrei über dieselbe OAuth-Verbindung.
- Die Startnachricht enthält genau eine
learningSessionIdund keine SkillPilot-ID. - Sämtliche fachlichen MCP-Toolschemas verlangen
learningSessionId. - Gültiges OAuth-Token ohne
learningSessionIdwird abgewiesen. - Gültige
learningSessionIdohne gültiges OAuth-Token wird abgewiesen. - Unbekannte, manipulierte, widerrufene oder abgelaufene Sessions scheitern ohne Fallback.
- Erfolgreiche Aufrufe lösen den Lernenden ausschließlich über die explizite
learningSessionIdauf. - Wiederholte Toolnutzung verändert
expires_atnicht. - Read- und Write-Scopes werden pro Tool strikt durchgesetzt.
- Lernziel-, Frontier- und Mastery-Tests bleiben unverändert grün.
- Deutsch und Englisch nutzen denselben V1-Toolvertrag gesteuert über
communicationLocale. - Token-Requests mit falschem/fehlendem Secret, fremder
client_id, falscher Callback-URL oder fremder Resource werden abgewiesen. - Authorization-Server-Metadaten veröffentlichen das aktive Produktionsprofil ohne offene DCR oder ungepinnte Public-Fallbacks.
- Das Diagnose-Feld akzeptiert
3601und86400bei aktivem Gate und lehnt3600,86401, Werte oberhalbPT24Hsowie Anfragen bei deaktiviertem Gate ab. - Diagnose-Starts (
3660/5400) wirken isoliert auf eine Session; der nächste normale Start hat wiederPT24H. - Jeder Learner-Turn beginnt mit erfolgreichem Kontextabruf (Sessionfehler blockiert jeden Fachtext), und Mutationen liefern den im selben Turn direkt maßgeblichen Nachfolgerzustand ohne Zusatzread.
- Der öffentliche V1-Toolkatalog enthält keine sessionlosen Start-, Capability-, Curriculum- oder Personalisierungstools.
- Write-Replays unterhalb
PT1H, bei fehlender gepinnter Version oder nach fortgeschrittener kanonischer Learner-Revision werden trotz identischerclientRequestIdabgewiesen.