Dieses Dokument beschreibt den derzeit implementierten Ablauf für eine vertrauliche Partneranwendung, die eine Verbindung zu Parkour Design herstellt. Client-Registrierung und Produktionszugriff erfordern eine technische Freigabe und eine Sicherheitsfreigabe.
Aktueller Vertrag: Das Protokoll ist implementiert und wird für abgestimmte Integrationen verwendet. Es handelt sich nicht um einen Autorisierungsdienst zur Selbstbedienung. Parkour Design stellt Client-ID, Client Secret, registrierte Redirect URIs und zulässige Scopes über einen sicheren Kanal bereit.
Umgebungen und Discovery
Verwenden Sie OpenID Connect Discovery, anstatt Endpunkt-URLs selbst zusammenzusetzen.
| Umgebung | Issuer | Discovery Document |
|---|---|---|
| Produktion | https://app.parkour.design | https://app.parkour.design/.well-known/openid-configuration |
| Test | https://parkour-test.web.app | https://parkour-test.web.app/.well-known/openid-configuration |
Rufen Sie das Discovery Document beim Start der Anwendung ab, speichern Sie es für einen begrenzten Zeitraum im Cache und aktualisieren Sie es, wenn sich Signaturschlüssel ändern. Der zurückgegebene issuer muss exakt dem konfigurierten Issuer entsprechen.
Das aktuelle Discovery Document veröffentlicht folgende Angaben:
| Funktion | Aktueller Wert |
|---|---|
| Response Type | code |
| Grant Types | authorization_code, refresh_token |
| Client-Authentifizierung | client_secret_basic, client_secret_post |
| ID-Token-Signatur | RS256 |
| PKCE-Methoden | S256, plain |
| Scopes | openid, profile, email |
| Claims | sub, email, email_verified, name |
Verwenden Sie client_secret_basic und PKCE S256. Verwenden Sie nicht plain, obwohl der aktuelle Server diese Methode aus Kompatibilitätsgründen ausweist.
Voraussetzungen für die Registrierung
Übermitteln Sie Parkour Design vor der Implementierung folgende Angaben:
- Anwendungsname und technisch verantwortliche Person;
- Test- und Produktions-Redirect-URIs;
- angeforderte Scopes und User Journey;
- Kontakte für die Übermittlung und Rotation von Zugangsdaten;
- Anforderungen für Logout, Aufhebung von Kontoverknüpfungen und Aufbewahrung.
Redirect URIs werden exakt abgeglichen. Schema, Host, Port, Pfad, Groß- und Kleinschreibung sowie ein abschließender Schrägstrich müssen dem registrierten Wert entsprechen. Verwenden Sie einen Callback ohne vorhandenen Query-String oder Fragment.
Der aktuelle Dienst unterstützt vertrauliche Backend-Clients. Reine Browser-Clients und native öffentliche Clients werden nicht unterstützt, da jede Token-Anfrage ein Client Secret erfordert.
Autorisierungsablauf
1. Browsertransaktion erstellen
Generieren und speichern Sie serverseitig:
- einen nur einmal nutzbaren
state-Wert mit hoher Entropie; - eine OIDC-
noncemit hoher Entropie; - einen PKCE-Verifier und die zugehörige SHA-256-Challenge;
- das vorgesehene Ziel nach der Anmeldung;
- eine kurze Ablaufzeit.
Binden Sie diese Werte an die Browsersitzung des Benutzers. Übertragen Sie weder Client Secret noch Verifier oder Tokens in einer URL.
2. Benutzer weiterleiten
Erstellen Sie die Autorisierungs-URL anhand des authorization_endpoint aus dem Discovery Document:
GET {authorization_endpoint}
?response_type=code
&client_id={client_id}
&redirect_uri={url_encoded_registered_redirect_uri}
&scope={url_encoded_approved_scopes}
&state={state}
&nonce={nonce}
&code_challenge={base64url_sha256_verifier}
&code_challenge_method=S256
Verwenden Sie ausschließlich die bei der Client-Registrierung genehmigten Scopes. openid email profile ist ein Beispiel, wenn alle drei Scopes genehmigt wurden; die Anforderung eines nicht genehmigten Scopes gibt invalid_scope zurück.
Parkour Design authentifiziert den Benutzer und bittet um seine Zustimmung. Eine erfolgreiche Antwort gibt Folgendes zurück:
{redirect_uri}?code={authorization_code}&state={state}
Eine abgelehnte Anfrage gibt Folgendes zurück:
{redirect_uri}?error=access_denied&state={state}
3. Callback validieren
Bevor Sie den Code austauschen:
- lehnen Sie einen fehlenden oder unerwarteten
stateab; - lehnen Sie eine abgelaufene oder bereits verwendete Browsertransaktion ab;
- verbrauchen Sie die Transaktion, damit der Callback nicht erneut ausgeführt werden kann;
- behandeln Sie einen OAuth-
error, ohne einen Token-Austausch zu versuchen.
Autorisierungscodes laufen nach fünf Minuten ab und können nur einmal verwendet werden.
4. Code serverseitig austauschen
Senden Sie eine formularcodierte Anfrage vom Backend des Partners:
curl --request POST "${TOKEN_ENDPOINT}" \
--user "${CLIENT_ID}:${CLIENT_SECRET}" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "code=${CODE}" \
--data-urlencode "redirect_uri=${REDIRECT_URI}" \
--data-urlencode "code_verifier=${CODE_VERIFIER}"
Der redirect_uri muss mit dem in der Autorisierungsanfrage verwendeten Wert identisch sein.
Eine erfolgreiche Antwort hat derzeit folgende Struktur:
{
"access_token": "<signed JWT>",
"refresh_token": "<opaque token>",
"token_type": "Bearer",
"expires_in": 900,
"scope": "email openid profile",
"id_token": "<signed JWT>"
}
Token-Antworten verwenden Cache-Control: no-store und Pragma: no-cache. Das id_token wird nur zurückgegeben, wenn openid gewährt wurde.
Identität validieren
Validieren Sie das ID-Token, bevor Sie eine Partnersitzung einrichten:
- rufen Sie Schlüssel vom
jwks_uriaus dem Discovery Document ab; - wählen Sie den durch den JWT-
kidangegebenen Schlüssel aus; - verlangen Sie eine
RS256-Signatur; - verlangen Sie die exakte Übereinstimmung des Issuers;
- verlangen Sie die Client-ID als Audience;
- validieren Sie Ablauf- und Ausstellungszeit mit einer geringen Toleranz für Zeitabweichungen;
- verlangen Sie die ursprüngliche
nonce; - verwenden Sie
subals stabilen Benutzeridentifikator von Parkour Design.
Aktuelle Claims des ID-Tokens:
{
"iss": "https://app.parkour.design",
"sub": "<opaque Parkour Design user ID>",
"aud": "<client ID>",
"email": "user@example.com",
"email_verified": true,
"name": "Example User",
"token_use": "id_token",
"iat": 0,
"exp": 0,
"nonce": "<authorization nonce>"
}
Verknüpfen Sie Konten nicht allein anhand der E-Mail-Adresse. Speichern Sie iss und sub als externen Identitätsschlüssel. Behandeln Sie E-Mail-Adresse und Name als veränderliche Profilattribute.
UserInfo ist verfügbar, wenn das Zugriffstoken openid enthält:
curl "${USERINFO_ENDPOINT}" \
--header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header "Accept: application/json"
{
"sub": "<opaque Parkour Design user ID>",
"email": "user@example.com",
"email_verified": true,
"name": "Example User"
}
Zugriffs- und Refresh-Tokens
| Token | Gültigkeitsdauer | Handhabung durch den Client |
|---|---|---|
| Autorisierungscode | 5 Minuten | Einmal austauschen und nach der Verwendung niemals speichern |
| ID-Token | 15 Minuten | Einmal validieren; nicht als API-Bearer-Token verwenden |
| Zugriffstoken | 15 Minuten | Serverseitig aufbewahren und ausschließlich an Ressourcen-APIs von Parkour Design senden |
| Refresh-Token | 30 Tage | Im Ruhezustand verschlüsseln und nach jeder Aktualisierung atomar ersetzen |
Refresh-Tokens rotieren bei jeder erfolgreichen Verwendung:
curl --request POST "${TOKEN_ENDPOINT}" \
--user "${CLIENT_ID}:${CLIENT_SECRET}" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=refresh_token" \
--data-urlencode "refresh_token=${REFRESH_TOKEN}"
Die Antwort enthält ein neues Zugriffstoken und ein Ersatz-Refresh-Token. Sie enthält kein neues ID-Token. Serialisieren Sie Refresh-Vorgänge für jede Benutzer- und Client-Sitzung und ersetzen Sie anschließend das gespeicherte Refresh-Token atomar. Die Wiederverwendung eines alten Tokens gibt invalid_grant zurück.
Parkour Design verbraucht das alte Refresh-Token, bevor dessen Ersatz zurückgegeben wird. Wenn nach einem Timeout oder einer verlorenen Antwort das Ergebnis unbekannt ist, versuchen Sie es nicht unkontrolliert mit dem alten Token erneut. Löschen Sie den lokalen Token-Zustand und starten Sie einen neuen Autorisierungsablauf. Gleichzeitige Refresh-Anfragen für dieselbe Sitzung verursachen dasselbe Wiederherstellungsrisiko.
Die aktuelle Gültigkeitsdauer von Refresh-Tokens ist gleitend: Jede erfolgreiche Rotation startet eine neue Gültigkeitsdauer von 30 Tagen. Parkour Design stellt derzeit keine Endpunkte für Token-Widerruf oder -Introspektion bereit. Beim Trennen der Verbindung in der Partneranwendung müssen die dort gespeicherten Tokens gelöscht werden. Ein Zugriffstoken kann bis zum Ende seiner 15-minütigen Gültigkeitsdauer gültig bleiben.
API-Zugriffstokens verwenden
Zugriffstokens von Parkour Design haben immer die Audience parkour-api. Sie sind ausschließlich Zugangsdaten für die unter Datenaustausch beschriebenen Ressourcen-APIs von Parkour Design. Leiten Sie sie niemals an eine Partner-API oder einen anderen Dritten weiter; vom Partner betriebene Ressourcen müssen einen eigenen Autorisierungsmechanismus verwenden.
ID-Tokens dienen zum Feststellen der Identität und zum Einrichten einer Partnersitzung. Verwenden Sie ein ID-Token nicht zum Aufruf einer API.
Aktuelles Scope-Verhalten
Die aktuellen Identitäts-Scopes sind openid, email und profile. Die abgestimmte Ressourcen-API autorisiert derzeit mit openid den Zugriff auf Veranstaltungen und Entwurfszusammenfassungen; sie stellt noch keine dedizierten Lese-Scopes bereit.
Dies ist eine Einschränkung der aktuellen Implementierung und kein Muster für neue APIs. Angeforderte Scopes und zugängliche Ressourcen werden bei der Client-Registrierung bestätigt. Künftige Ressourcenverträge können dedizierte Scopes einführen.
Aktuelle Tokens und UserInfo enthalten E-Mail-Adresse und Name in größerem Umfang, als die einzelnen Scopes email und profile erwarten lassen. Clients sollten weiterhin ausschließlich genehmigte Scopes anfordern und dürfen sich nicht darauf verlassen, dass dieses weiter gefasste Verhalten unverändert bleibt.
Fehlerbehandlung
Der Autorisierungsendpunkt übermittelt Fehler auf zwei Wegen:
- nachdem eine Redirect URI validiert wurde, führen die Ablehnung der Zustimmung und einige
invalid_request-Fehler bei der Zustimmungsverarbeitung zu einer Weiterleitung an diesen Callback miterrorund dem ursprünglichenstate; - Validierungsfehler, die auftreten, bevor ein vertrauenswürdiger Callback feststeht, einschließlich Fehlern bei Client, Redirect URI, Scope, Antworttyp und PKCE, geben direkt eine HTTP-
400-Antwort im JSON-Format zurück.
Fehler des Token-Endpunkts und der Ressourcen-API verwenden ebenfalls einen kompakten JSON-Body:
{"error": "invalid_grant"}
| Fehler | Bedeutung |
|---|---|
invalid_client | Fehlender, unbekannter, inaktiver oder nicht korrekt authentifizierter Client |
invalid_redirect_uri | Fehlende oder nicht registrierte Callback URI; dies ist ein implementierungsspezifischer Code der aktuellen Version von Parkour Design |
invalid_scope | Leere oder nicht genehmigte Scope-Menge |
invalid_request | Fehlende Felder oder ungültige PKCE-Kombination |
access_denied | Benutzer hat die Zustimmung abgelehnt |
invalid_grant | Ungültiger, abgelaufener, wiederverwendeter oder falsch gebundener Code oder Refresh-Token |
unsupported_response_type | Andere Autorisierungsantwort als code |
unsupported_grant_type | Nicht unterstützter Token-Grant |
invalid_token | Fehlendes, fehlerhaftes, abgelaufenes oder ungültiges API-Bearer-Token |
Legen Sie unbearbeitete Token-Antworten oder Protokolldiagnosen nicht gegenüber dem Endbenutzer offen. Protokollieren Sie Korrelations-ID, Endpunkt, Status und sicheren Fehlercode, jedoch keine Autorisierungscodes, Tokens, Geheimnisse, Nonce-Werte oder personenbezogenen Daten.
Aktuelle Einschränkungen
- Client-Registrierung und Widerruf der Zustimmung werden manuell abgestimmt.
- PKCE,
stateundnoncewerden akzeptiert, aber vom Server nicht erzwungen; Partner-Clients müssen sie erzwingen. - Discovery weist PKCE
plainaus; Partner-Clients müssenS256verwenden. - Es gibt keinen Endpunkt für Token-Widerruf, Introspektion, dynamische Registrierung oder standardmäßige Sitzungsbeendigung.
- Die erneute Verwendung eines Refresh-Tokens widerruft nicht die gesamte Token-Familie.
- Zugriffstokens bleiben nach einem lokalen Logout bis zu ihrem Ablauf gültig.
- Die aktuelle Ressourcenautorisierung verwendet
openidanstelle dedizierter Ressourcen-Scopes.
Prüfen Sie diese Einschränkungen während des Onboardings und ersetzen Sie sie nicht stillschweigend durch Annahmen, die auf einem anderen OAuth-Provider beruhen.