Erkläre mir den OAuth 2.0 Authorization Code Flow.
Kurzantwort
Die App leitet den Benutzer zum Autorisierungsserver weiter, um sich anzumelden und einzuwilligen. Der Server leitet mit einem kurzlebigen Autorisierungscode zurück. Das Backend der App tauscht diesen Code (plus sein Client-Geheimnis) dann am Token-Endpunkt über einen Server-zu-Server-Back-Channel gegen ein Access-Token. Das hält Tokens aus Browser/URL fern. Öffentliche Clients ergänzen PKCE, um den Code an den ursprünglichen Anforderer zu binden.
OAuth 2.0 verwirrt viele Kandidaten, weil sie es mit der Anmeldung verwechseln. Bei OAuth geht es um delegierte Autorisierung – einer App zu erlauben, im Namen des Benutzers auf einer Ressource zu handeln – nicht darum, den Benutzer zu identifizieren (das ist OIDC, darüber gelegt). Der Authorization Code Flow ist die sichere Standardwahl.
Der Ablauf, Schritt für Schritt
- Weiterleitung zur Autorisierung. Die App schickt den Browser des Benutzers zum Autorisierungsserver mit ihrer Client-ID, den angeforderten Scopes, einer Redirect-URI und einem
state-Wert (CSRF-Schutz). - Benutzer authentifiziert sich und willigt ein. Der Benutzer meldet sich am Autorisierungsserver an – die App sieht das Passwort nie – und genehmigt die angeforderten Scopes.
- Code zurückgegeben. Der Autorisierungsserver leitet zur registrierten URI der App zurück, mit einem kurzlebigen, einmal verwendbaren Autorisierungscode im Query-String.
- Back-Channel-Austausch. Das Backend der App sendet diesen Code plus sein Client-Geheimnis an den Token-Endpunkt und erhält ein Access-Token (und oft ein Refresh-Token). Dieser Schritt erfolgt Server-zu-Server, nicht im Browser.
- Die API aufrufen. Die App nutzt das Access-Token als Bearer-Berechtigung, um den Ressourcenserver aufzurufen.
Warum dieses Design
Die Kernidee ist, dass das mächtige Access-Token nie durch den Browser oder eine URL reist, wo es geloggt, gecacht oder über Referrer-Header geleakt werden könnte. Nur der geringwertige, kurzlebige Code tut das, und der Code ist ohne das Client-Geheimnis nutzlos. Deshalb wird der Code Flow dem inzwischen veralteten Implicit Flow vorgezogen, der Tokens direkt in der Weiterleitung offenlegte.
PKCE für öffentliche Clients
Mobile Apps und SPAs können kein Client-Geheimnis vorhalten. PKCE (Proof Key for Code Exchange) behebt das: Der Client sendet vorab eine gehashte zufällige code_challenge und den passenden code_verifier beim Token-Austausch und beweist so, dass derselbe Client, der den Ablauf startete, ihn auch beendet – ein gestohlener Code kann so von einem Angreifer nicht eingelöst werden.
Worauf Interviewer achten
Die Sequenz Weiterleitung/Einwilligung/Code/Back-Channel-Austausch, der Grund, warum Tokens aus dem Browser ferngehalten werden, der Code Flow gegenüber dem Implicit Flow und PKCE für Clients, die kein Geheimnis halten können. Bonus für den Hinweis, dass OAuth Autorisierung und OIDC Authentifizierung ist.
Wahrscheinliche Anschlussfragen
- Welches Problem löst PKCE und warum brauchen es Mobile-/SPA-Clients?
- Warum wird der Authorization Code Flow dem Implicit Flow vorgezogen?
- Was ist der Unterschied zwischen OAuth 2.0 Autorisierung und OpenID Connect Authentifizierung?