Die Anleitung
Ein „Flow“ (oder „Grant“) ist die Art, wie eine Anwendung ihre Token erhält. Es gibt mehrere, weil Anwendungen sehr verschieden sind: Eine Website, eine mobile App, ein Fernseher, ein Dienst ohne Benutzer… haben nicht dieselben Einschränkungen oder dieselben zu schützenden Geheimnisse.
Siehe auch: die Abläufe als Sequenzdiagramme · erweiterte Funktionen erklärt (PAR, JAR, JARM, DPoP, CIBA) · die Zeitleiste von OAuth und OpenID Connect
Alles andere gibt es aus historischen Gründen oder für besondere Bedürfnisse. Refresh Token ist kein Anmeldeablauf: Es ergänzt, um die Sitzung am Leben zu halten.
OAuth 2.0 (2012) musste sowohl Servern dienen, die ein Geheimnis aufbewahren können, als auch Browser-Anwendungen, die das nicht können. Daher implicit für SPAs, password für „vertrauenswürdige“ Anwendungen und code für Server. Mit den Jahren wurde klar, dass Tokens in der URL durchsickerten (implicit) und dass die Weitergabe des Passworts an die Anwendung den ganzen Sinn zunichtemachte (password). OAuth 2.1 und die aktuellen Sicherheitsempfehlungen haben deshalb alles auf Code + PKCE zurückgeführt und Client Credentials und Device für ihre eigenen Fälle beibehalten. OIDC hat den Hybrid-Ablauf hinzugefügt, um die Identität sofort zu erhalten.
Einsetzen, wenn: sich eine Person bei einer Website (mit oder ohne Server), einer SPA, einer mobilen oder Desktop-Anwendung anmeldet. Mit einem Server, der ein Geheimnis aufbewahren kann, fügen Sie das client_secret hinzu; ohne (SPA, mobil) genügt PKCE.
Warum es das gibt: Der Browser erhält nur einen kurzlebigen Code zur einmaligen Verwendung; die Tokens gehen direkt vom Server der Anwendung zum OP („Back Channel“). PKCE bindet den Code an den, der ihn angefordert hat, sodass ein abgefangener Code für niemand anderen nützlich ist.
Fallstricke: PKCE vergessen (jetzt auch für vertrauliche Clients Pflicht), state und nonce nicht prüfen, zu weit gefasste redirect_uris akzeptieren, Tokens in localStorage bei einer SPA.
Schritt-für-Schritt-Anleitung:
code_verifier (ein zufälliges Geheimnis), state, nonce und berechnet code_challenge = SHA-256(code_verifier)./authorize?response_type=code&code_challenge=…&state=…&nonce=….redirect_uri?code=…&state=… zurück./token mit dem Code und dem code_verifier auf (und ihrem Geheimnis, falls vorhanden).iss, aud und nonce.Einsetzen, wenn: die Anwendung die Identität sofort braucht (vor dem Code-Austausch), zum Beispiel für die serverseitige Sitzungsvalidierung oder weil eine ältere Bibliothek (ASP.NET, Java EE) es standardmäßig konfiguriert.
Warum es das gibt: OIDC wollte erlauben, die Identität sofort zu lesen und dabei den Code beizubehalten, um Tokens sicher zu erhalten. c_hash und at_hash im ID-Token binden Code und Access-Token an diese Identität.
Fallstricke: Tokens im URL-Fragment (sichtbar für Verlauf und Skripte), ungeprüfte c_hash/at_hash und eine vergessene Pflicht-nonce. Bevorzugen Sie den einfachen Code-Flow, sofern nichts dagegen spricht.
Schritt-für-Schritt-Anleitung:
/authorize?response_type=code id_token&nonce=… (oder code token, code id_token token).#code=…&id_token=…&state=… im Fragment (response_mode=fragment standardmäßig) oder per POST (form_post) zurück.c_hash.Einsetzen, wenn: bei Neuentwicklungen fast nie. Man trifft es in alten SPAs an oder um zu prüfen, ob eine Anwendung es wirklich verbietet.
Warum es das gibt: Bevor Browser Aufrufe zwischen Origins (CORS) und PKCE beherrschten, konnte eine SPA /token nicht aufrufen und bekam die Tokens deshalb direkt.
Fallstricke: Das Token reist in der URL: Verlauf, Proxy-Logs, Referer-Header, Erweiterungen. Kein Refresh-Token, keine Bindung an den Aufrufer. Aus OAuth 2.1 entfernt.
Schritt-für-Schritt-Anleitung:
/authorize?response_type=id_token token&nonce=….#id_token=…&access_token=…&state=….Einsetzen, wenn: ein Dienst, ein geplanter Job oder ein Daemon eine API in eigenem Namen aufruft: Synchronisation, Nachtjob, Microservices, die miteinander sprechen.
Warum es das gibt: Hinter vielen API-Aufrufen steht keine Person. Der Client weist seine Identität nach (Geheimnis oder besser: signierte Assertion) und erhält ein auf seine Scopes begrenztes Access-Token.
Fallstricke: kein ID-Token oder Refresh-Token (das ist normal). Legen Sie dieses Geheimnis nie in eine verteilte Anwendung (mobil, SPA). Vergeben Sie nur die nötigsten Scopes und rotieren Sie das Geheimnis.
Schritt-für-Schritt-Anleitung:
POST /token mit grant_type=client_credentials, scope=… und der Client-Authentifizierung (Basic-Secret oder im Body).Authorization: Bearer ….Einsetzen, wenn: Sie kurzlebige Access-Tokens (einige Minuten) wollen und die Person trotzdem lange angemeldet bleibt. Wird mit dem Scope offline_access angefordert.
Warum es das gibt: Je länger ein Token lebt, desto schlimmer ist sein Diebstahl. Das Refresh-Token bleibt auf Anwendungsseite, fern von den APIs, und dient nur zur Erneuerung.
Fallstricke: Ein gestohlenes Refresh-Token bedeutet verlängerten Zugriff: sichere Speicherung, Rotation (bei jeder Nutzung ein neues, das alte wird ungültig) und Erkennung von Wiederverwendung.
Schritt-für-Schritt-Anleitung:
POST /token mit grant_type=refresh_token&refresh_token=….Einsetzen, wenn: Fernseher, Konsole, vernetztes Gerät, Drucker, Kommandozeilenwerkzeug: Das Gerät hat keinen Browser oder keine bequeme Tastatur.
Warum es das gibt: Ein Passwort mit einer Fernbedienung einzutippen ist mühsam und riskant. Ein kurzer Code wird angezeigt; die Person gibt ihn auf ihrem Telefon oder Computer ein, wo sie sich ganz normal authentifiziert.
Fallstricke: kurzlebiger Einmalcode, nicht zu schnell abfragen (slow_down) und Versuchsbegrenzungen, damit ein Code nicht erraten werden kann. Phishing ist möglich: Zeigen Sie klar, was die Person autorisiert.
Schritt-für-Schritt-Anleitung:
/device_authorization auf und erhält device_code, user_code und die Verifizierungsadresse./token mit dem device_code ab. Zuerst authorization_pending, dann die Tokens.Einsetzen, wenn: es zu vermeiden ist. Manchmal für eine Migration von einem alten System oder für automatisierte Tests in kontrollierter Umgebung geduldet.
Warum es das gibt: ein Übergang für Anwendungen, die bereits Passwörter entgegennahmen, ohne ihre Oberfläche zu ändern.
Fallstricke: Die Anwendung sieht das Passwort: genau das, was OIDC vermeiden will. Keine Multi-Faktor-Authentifizierung, kein SSO, leichteres Phishing. Aus OAuth 2.1 entfernt.
Schritt-für-Schritt-Anleitung:
POST /token mit grant_type=password&username=…&password=….Alle Details in Bildern: Sequenzdiagramme.
Testen Sie jeden Ablauf. Der Testprovider von ID-Kit kann all diese Abläufe spielen, mit simulierten Fehlern; die Testanwendung führt sie gegen Ihren echten Provider aus.