Der OAuth 2.0 Grant-Type authorization_code
Die aktuelle OAuth 2.0 Spezifikation sieht verschiedene Grant-Typen für unterschiedliche Aufgaben vor. Einer der am häufigsten verwendeten Grant-Typen ist „authorization-code“. Um beispielsweise den Datenspeicherdienst Dropbox nutzen zu können, muss ein neuer Benutzer sich dort zunächst registrieren. Alternativ bietet Dropbox jedoch auch ein Login über ein bestehendes Google-Konto an. Nutzt man diese Möglichkeit, so werden die bestehenden Benutzerdaten aus dem eigenen Google-Konto als Autorisierung an Dropbox übertragen und das Konto bei Dropbox aktiviert. Da diese Datenübertragung aus gutem Grund besonders stark abgesichert sein sollte, sind verschiedene Maßnahmen bei allen beteiligten Partnern durchzuführen. Die Autorisierung (Authorization-Flow) muss zudem nach einem festgelegten Schema ablaufen, um die Berechtigungen ausstellen zu können.
Das Autorisierungsverfahren im Detail
Betrachten wir uns das mehrstufige Autorisierungsverfahren einmal genauer werden wir feststellen, dass hier einige wichtige Schritte zwischen den beteiligten Stellen nötig werden. Zunächst gibt es bei dem OAuth2-Grant „authorization_code“ vereinfacht dargestellt insgesamt 3 beteiligte Stellen wie folgt:
-
Einen Benutzer, der sich bei einem Dienstleister, einer App oder Webservice anmelden und dessen Leistungen in Anspruch nehmen möchte.
-
Einen Client (Dienstleister als Webseite oder Web-Anwendung), der seinen Besuchern unterschiedliche Leistungen anbieten möchte.
-
Einen Provider, bei dem der Benutzer bereits ein Konto angelegt hat und mit seinen vollständigen Daten gespeichert ist.
Bei einem Client können unterschiedlichste Anforderungen für die Benutzung seiner Dienstleistungen gegeben sein. Dies gilt es bei einer Anmeldung und der folgenden Berechtigung zu beachten. Um beim Beispiel von Dropbox zu bleiben entsteht für einen Benutzer nun das folgende vorerst einfach dargestellte Szenario:
-
Der Benutzer ruft die Webseite von Dropbox auf und findet dort einen Anmelde- bzw. Registrierungsdialog. Gehen wir hier nun davon aus, dass der Benutzer noch nicht bei Dropbox registriert ist. Um das Login schnell und unkompliziert durchführen zu können, kann sich unser Benutzer über die Funktion „Mit Google registrieren“ bei Dropbox anmelden.
-
Sobald der Benutzer auf den Button „Mit Google anmelden“ klickt, wird ein gesichertes Loginfenster von Google als Provider geöffnet. Hier kann sich der Benutzer nun mit seinen Login-Daten anmelden. Nach Eingabe von Email und Passwort wird der Benutzer gefragt, ob er die Dienste von Dropbox nutzen und freigeben möchte. In diesem Dialog wird detailliert aufgezeigt, welche Berechtigungen (persönliche Daten etc.) Dropbox haben möchte. Wenn Sie als Benutzer nun Dropbox die Erlaubnis erteilen, werden Sie zurückgeleitet und sind sofort bei Dropbox angemeldet.
Protokoll- und Prozess-Schritte für den Client
Aus Sicht des Benutzers führt dieses Anmeldeverfahren zum einen sehr schnell zu einem Zugang bei einem neuen Dienstleister-Client. Ebenso komfortabel ist diese Anmeldung dahingehend, da man durch nur noch eine gültige Benutzeranmeldung bei beispielsweise Facebook diese für alle weiteren Anmeldungen bei Clients, die das OAuth2-Verfahren unterstützen, nutzen kann. Für die Clients ist das Verfahren aber etwas aufwändiger, um allen Sicherheitsaspekten auch gerecht zu werden. Für die Clients ergeben sich dabei die folgenden Prozessschritte, um einen Benutzer von einem Fremdprovider zu registrieren:
-
Der Client muss über einen Login- oder Redirect-Dialog den Benutzer zu seinem Provider umleiten. Zudem müssen die gewünschten Berechtigungsvorgaben über verschiedene Parameter wie client-id, redirect-uri, state und response-mode für eine ausreichende Autorisierung mitgeliefert werden.
-
Sobald sich der Benutzer mit seinen Login-Daten beim Provider eingeloggt hat wird er gefragt, ob er die geforderten Berechtigungen des Clients akzeptiert.
-
Wenn der Benutzer die Berechtigungen akzeptiert, wird er zum Client auf die bereitgestellte URI zurückgeleitet.
-
Der Client sendet mit den erhaltenen Daten nun eine weitere Anfrage an den Authentifizierungsserver. Hier werden verschiedene Parameter wie grant-type, client_id, client_secret, redirect_uri und code mit übertragen, um eine eindeutige Autorisierung zu erhalten. Im Positivfall erhält der Client ein Zugangs- bzw. Access-Token vom Server. Danach wird der Benutzer beim Client zugelassen und dessen Dienste freigeschaltet.
-
Der Client kann mit dem gültigen Token nun weitere Anfragen an den Provider senden um sich beispielsweise die vollständigen Benutzerdaten zu holen oder Änderungen am Benutzerkonto auszutauschen. Dies wird in der Regel auch durchgeführt, um ein ordentliches Benutzerkonto beim Client zu führen.
Sicherheit an erster Stelle
Obwohl OAuth 2 über einige weitreichende Berechtigungsstufen verfügt, ist nicht grundsätzlich alles perfekt abgesichert. Sobald ein Angreifer ein Zugangs- oder Access-Token in seinen Besitz bringt, könnte er unter bestimmten Umständen auch auf die Ressourcen des Benutzers zugreifen und das Autorisierungsverfahren aushebeln. Aus diesem Grund sollte der Client bei der Benutzerumleitung zum Autorisierungsserver den optionalen Parameter „state“ mit einem CSRF-Token ausstatten. Dieser kann in der Benutzersitzung als zusätzliche ID gespeichert werden. Somit kann bei der Rückkehr der Benutzer eindeutig identifiziert werden und ein Angriff über einen Fremdzugang ausgeschlossen werden. Idealerweise sollte der Paramater dahingehend eigentlich als „required“ definiert werden.