OAuth 2.0 - Das Gute, das Schlechte und das Hässliche

In einer Welt, die von Social Media dominiert wird, ist es schwer, keine Clientanwendung zu finden, mit der Sie auf eingeschränkte Ressourcen auf einem anderen Server zugegriffen haben. Beispielsweise haben Sie möglicherweise eine webbasierte Anwendung (z. B. NY Times) für die gemeinsame Nutzung eines Servers verwendet interessanter Nachrichtenartikel auf Ihrer Facebook-Wand oder twittern darüber. Oder Sie haben Quoras iPhone-App verwendet, die auf Ihr Facebook- oder Google+ Profil zugreift und die Ergebnisse basierend auf Ihren Profildaten anpasst, z. B. den Vorschlag, basierend auf Ihrer Freundesliste andere Benutzer hinzuzufügen oder zu Quora einzuladen. Die Frage ist, wie diese Anwendungen auf Ihre Konten bei Facebook, Twitter oder Google+ zugreifen und wie sie auf Ihre vertraulichen Daten zugreifen können. Bevor sie dies tun können, müssen sie dem Ressourcenserver eine Form von Authentifizierungsnachweisen und Autorisierungsberechtigungen vorlegen.


Einführung in OAuth 2.0

OAuth wird oft als Valet Key für das Web beschrieben.

Nun wäre es wirklich so uncool Um Ihre Facebook- oder Google-Anmeldeinformationen mit einer Drittanbieter-Clientanwendung zu teilen, die nur über Ihre Freunde Bescheid wissen muss, gibt sie der App nicht nur unbegrenzten und unerwünschten Zugriff auf Ihr Konto, sondern weist auch die mit Kennwörtern verbundene Schwäche auf. An dieser Stelle kommt OAuth ins Spiel, da hier ein Zugriffsdelegierungs- / Berechtigungsrahmen skizziert wird, der verwendet werden kann, ohne dass Passwörter gemeinsam verwendet werden müssen. Aus diesem Grund wird OAuth oft als Valet Key für das Web beschrieben. Es kann als spezieller Schlüssel betrachtet werden, der den Zugriff auf begrenzte Funktionen und für einen begrenzten Zeitraum ermöglicht, ohne die vollständige Kontrolle zu verlieren, genau wie der Valet-Schlüssel für ein Auto es dem Parkwächter ermöglicht, das Auto für eine kurze Strecke zu fahren und zu blockieren Zugriff auf den Trunk und das Bordtelefon.

OAuth ist jedoch kein neues Konzept, sondern eine Standardisierung und kombinierte Weisheit vieler etablierter Protokolle. Erwähnenswert ist auch, dass OAuth nicht nur auf Social-Media-Anwendungen beschränkt ist, sondern eine standardisierte Möglichkeit bietet, Informationen sicher zwischen verschiedenen Arten von Anwendungen auszutauschen, die ihre APIs für andere Anwendungen verfügbar machen. OAuth 2.0 hat eine völlig neue Prosa und ist nicht abwärtskompatibel zu seiner Vorgängerspezifikation. Allerdings ist es gut, zuerst ein paar grundlegende OAuth2.0-Vokabeln zu behandeln, bevor in weitere Details eingegangen wird.

  • Ressourcenbesitzer : Eine Entität, die Zugriff auf eine geschützte Ressource gewähren kann. Meistens ist es ein Endbenutzer.
  • Klient : Eine Anwendung, die geschützte Ressourcenanfragen im Namen des Ressourceninhabers und mit seiner Berechtigung vornimmt. Dies kann eine serverbasierte, mobile (native) oder Desktopanwendung sein.
  • Ressourcenserver : Der Server, der die geschützten Ressourcen hostet und geschützte Ressourcenanfragen annehmen und beantworten kann.
  • Autorisierungsserver : Der Server, der Zugriff ausgibt, gewährt / erteilt dem Client nach erfolgreicher Authentifizierung des Ressourcenbesitzers und dem Erhalt der Berechtigung.
  • Zugangstoken : Zugriffstoken sind Berechtigungsnachweise, die der Client dem Ressourcenserver für den Zugriff auf geschützte Ressourcen zur Verfügung stellt. Normalerweise handelt es sich dabei um eine Zeichenfolge, die aus einem bestimmten Gültigkeitsbereich, einer Lebensdauer und anderen Zugriffsattributen besteht, und kann die Berechtigungsinformationen selbst nachprüfbar enthalten.
  • Token aktualisieren : Obwohl dies nicht zwingend vorgeschrieben ist, haben Zugriffstoken idealerweise eine Ablaufzeit, die einige Minuten bis zu mehreren Stunden dauern kann. Wenn ein Zugriffstoken abgelaufen ist, kann der Client den Autorisierungsserver auffordern, ein neues Zugriffstoken unter Verwendung des vom Berechtigungsserver ausgegebenen Aktualisierungstokens auszugeben.

Was ist los mit OAuth 1.0??

Der Hauptnachteil von OAuth 1.0 war die inhärente Komplexität, die zur Implementierung der Spezifikation erforderlich war.

Nichts wirklich! Twitter funktioniert mit OAuth 1.0 immer noch einwandfrei und unterstützt gerade einen kleinen Teil der 2.0-Spezifikation. OAuth 1.0 war eine durchdachte Spezifikation und ermöglichte den sicheren Austausch sicherer Informationen ohne den durch SSL verursachten Overhead. Der Grund, warum wir eine Überarbeitung brauchten, beruhte hauptsächlich auf der Komplexität bei der Implementierung der Spezifikation. Im Folgenden sind einige Bereiche aufgeführt, in denen OAuth 1.0 nicht beeindruckt:

  • Jede Anfrage unterschreiben Wenn der Client bei jeder API-Anforderung Signaturen generiert und diese bei jedem Empfang einer Anforderung auf dem Server überprüft, stellte dies einen großen Rückschlag für Entwickler dar, da die Parameter vor der Anforderung analysiert, codiert und sortiert wurden. OAuth 2.0 hat diese Komplexität durch einfaches Senden der Token über SSL entfernt, wodurch dasselbe Problem auf Netzwerkebene gelöst wurde. Bei OAuth 2.0 sind keine Signaturen erforderlich.
  • Adressierung nativer Anwendungen : Mit der Entwicklung von nativen Anwendungen für mobile Geräte schien der webbasierte Fluss von OAuth 1.0 ineffizient zu sein und erforderte die Verwendung von Benutzeragenten wie einem Webbrowser. OAuth 2.0 bietet mehr Flows, die speziell für native Anwendungen geeignet sind.
  • Klare Trennung der Rollen : OAuth 2.0 bietet die dringend benötigte Rollentrennung für den Autorisierungsserver, der den Client authentifiziert und autorisiert, und die des Ressourcenservers, der API-Aufrufe für den Zugriff auf eingeschränkte Ressourcen verarbeitet.

OAuth 2.0 in der Tiefe

Vor dem Initiieren des Protokolls muss sich der Client beim Autorisierungsserver registrieren, indem er seinen Client-Typ und seine Weiterleitungs-URL (an die der Autorisierungsserver weiterleiten soll, nachdem der Ressourcenbesitzer den Zugriff erteilt oder ablehnt) und alle anderen vom Server erforderlichen Informationen bereitstellt und wiederum wird eine Client-ID (client_id) und ein Client-Secret (client_secret) gegeben. Dieser Vorgang wird als Client-Registrierung bezeichnet. Nach der Registrierung kann der Client einen der folgenden Datenflüsse annehmen, um mit dem Server zu interagieren.

Verschiedene OAuth-Flüsse

OAuth 2.0 bringt fünf neue Datenflüsse in die Tabelle ein und gibt Entwicklern die Flexibilität, einen von ihnen zu implementieren, je nach Art des involvierten Clients:

  • User-Agent-Fluss : Geeignet für Clients, die normalerweise in Benutzeragenten (z. B. Clients, die in einem Webbrowser ausgeführt werden) mit einer Skriptsprache wie JavaScript implementiert sind. Wird hauptsächlich von nativen Anwendungen für Mobilgeräte oder Desktop-Computer verwendet, wobei der eingebettete oder externe Browser als Benutzeragent für die Autorisierung verwendet wird Implizite Bewilligung Genehmigung.
  • Web Server Flow : Dies nutzt die Zugangscode Grant und ist ein Umleitungsfluss, der eine Interaktion mit dem Benutzeragenten des Endbenutzers erfordert. Daher ist es am besten für Clients geeignet, die Teil von Webserver-basierten Anwendungen sind, auf die normalerweise über einen Webbrowser zugegriffen wird.
  • Benutzername und Passwort : Wird nur verwendet, wenn zwischen dem Client und dem Ressourceninhaber ein hohes Vertrauen besteht und wenn andere Flows nicht praktikabel sind, da die Berechtigungsnachweise des Ressourceninhabers übertragen werden. Beispiele für Clients können ein Gerätebetriebssystem oder eine hochprivilegierte Anwendung sein. Dies kann auch verwendet werden, um vorhandene Clients mithilfe von HTTP-Basic- oder Digest-Authentifizierungsschemata zu OAuth zu migrieren, indem die gespeicherten Anmeldeinformationen in ein Zugriffstoken konvertiert werden.
  • Assertionsfluss : Ihr Client kann dem Autorisierungsserver eine Assertion wie SAML Assertion gegen ein Zugriffstoken vorlegen.
  • Ablauf der Client-Anmeldeinformationen : OAuth wird hauptsächlich für delegierten Zugriff verwendet. Es gibt jedoch Fälle, in denen der Client die Ressource besitzt oder der delegierte Zugriff bereits außerhalb eines typischen OAuth-Flusses gewährt wurde. Hier tauschen Sie einfach Client-Anmeldeinformationen gegen ein Zugriffstoken aus.

Eine ausführliche Diskussion der einzelnen Abläufe würde den Rahmen dieses Artikels sprengen. Ich würde eher empfehlen, die Spezifikation für ausführliche Flussinformationen zu lesen. Um ein Gefühl für das Geschehen zu bekommen, gehen wir näher auf einen der meist genutzten und unterstützten Flows ein: Den Webserver-Flow.

Der Webserverablauf

Da es sich um einen umleitungsbasierten Ablauf handelt, muss der Client in der Lage sein, mit dem Benutzeragenten des Ressourceninhabers (der in den meisten Fällen ein Webbrowser ist) zu interagieren, und ist daher normalerweise für eine Webanwendung geeignet. Das folgende Diagramm zeigt aus der Vogelperspektive, wie der Endbenutzer (oder der Besitzer der Ressource) die Clientanwendung (in diesem Fall die Anwendung auf dem Web-Server) verwendet, um sich beim Autorisierungsserver zu authentifizieren und zu autorisieren, um auf die geschützten Ressourcen zuzugreifen vom Ressourcenserver.


Den Kunden authentifizieren und autorisieren

Der Client initiiert im Namen des Ressourceneigentümers den Fluss, indem er mit einem Parameter response_type zum Autorisierungsendpunkt umgeleitet wird Code, eine Client-ID, die während der Client-Registrierung abgerufen wird, eine Umleitungs-URL, einen angeforderten Bereich (optional) und einen lokalen Status (falls vorhanden). Um ein Gefühl dafür zu bekommen, wie es wirklich funktioniert, hier ein Screenshot, wie eine typische Anfrage / Antwort aussehen würde:


Dem Ressourceninhaber wird normalerweise eine Webschnittstelle angezeigt, über die er authentisieren und prüfen kann, welche Berechtigungen die Clientanwendung im Namen des Besitzers verwenden kann.


Unter der Annahme, dass der Ressourcenbesitzer dem Client Zugriff gewährt, leitet der Autorisierungsserver den Benutzeragenten mithilfe der zuvor angegebenen Umleitungs-URL zusammen mit dem Autorisierungscode, wie in der nachstehenden Antwort angegeben, zurück an den Client.


Exchange-Autorisierungscode für Token

Der Kunde dann Beiträge an einen anderen Autorisierungsendpunkt senden und den im vorherigen Schritt erhaltenen Autorisierungscode zusammen mit der Umleitungs-URL, seiner Client-ID und seinem geheimen Code, die während der Clientregistrierung abgerufen wurden, und einem Parameter grant_type als festlegen Zugangscode.


Der Server überprüft dann den Autorisierungscode und stellt sicher, dass die Weiterleitungs-URL mit der im vorherigen Schritt identisch ist. Bei Erfolg antwortet der Server mit einem Zugriffstoken und optional einem Aktualisierungstoken.


Beschränkte Ressourcen mit Zugriffstoken anfordern

Der Client kann nun die von der Implementierung bereitgestellten APIs verwenden und den Ressourcenserver nach einer eingeschränkten Ressource abfragen, indem er das Zugriffstoken im Authorization-Header der Anforderung weitergibt. Eine CURL-Beispielanforderung an das Blogger-API von Google, um ein Blog mit seiner Kennung zu erhalten, würde folgendermaßen aussehen:

 $ curl https://www.googleapis.com/blogger/v3/blogs/5223788876950011016 -H 'Autorisierung: OAuth ya29.AHES6ZRTj1GNxAby81Es-p_YPWWNBAFRvBYVsYj2HZJfJHU'

Beachten Sie, dass wir das Access-Token als Autorisierungsheader der Anforderung hinzugefügt und das Token auch durch Einfügen in einfache Anführungszeichen ersetzt haben, da das Token Sonderzeichen enthalten kann. Beachten Sie, dass ein Fluchtweg vom Zugriffstoken nur bei Verwendung von curl erforderlich ist. Daraufhin wird folgende Anfrage gesendet:


Der Ressourcenserver überprüft dann die übergebenen Berechtigungsnachweise (Zugriffstoken) und antwortet bei Erfolg mit den angeforderten Informationen.


Diese Beispiele stammen von OAuth2.0 Playground und sind typisch für die Implementierung der Spezifikation durch Google. Unterschiede können beim Versuch auftreten, den gleichen Fluss mit anderen Anbietern (wie Facebook oder Salesforce) zu versuchen, und hier schleichen sich Interoperabilitätsprobleme ein, die wir später besprechen.

Erneuerndes Zugriffstoken

Zwar nicht von der Spezifikation vorgegeben, aber die Zugriffstoken sind in der Regel von kurzer Dauer und haben eine Verfallszeit. Wenn also ein Zugriffstoken abgelaufen ist, sendet der Client das Aktualisierungstoken zusammen mit seiner Client-ID und seinem geheimen Schlüssel sowie dem Parameter grant_type an den Autorisierungsserver refresh_token.


Der Autorisierungsserver antwortet dann mit dem neuen Wert für das Zugriffstoken.


Es gibt zwar einen Mechanismus, um das ausgegebene Aktualisierungstoken zu widerrufen, aber normalerweise bleibt das Aktualisierungstoken für immer erhalten und muss geschützt und als geheimer Wert behandelt werden.


Was ist los mit OAuth 2.0??

Das gute Zeug

Bei der Akzeptanzrate ist OAuth 2.0 definitiv eine Verbesserung gegenüber seinem armen Vorgänger. Instanzen von Entwicklergemeinschaften, die während der Implementierung der Signaturen von 1.0 ins Wanken geraten, sind nicht unbekannt. OAuth 2.0 bietet auch mehrere neue Grant-Typen, mit denen viele Anwendungsfälle wie native Anwendungen unterstützt werden können. Der USP dieser Spezifikation ist jedoch die Einfachheit gegenüber der Vorgängerversion.

Die schlechten Teile

Die Spezifikation hat ein paar lose Enden, da sie einige erforderliche Komponenten nicht richtig definiert oder sie den Implementierungen überlassen muss, um zu entscheiden, wie:

Lose Enden in der OAuth 2.0-Spezifikation führen wahrscheinlich zu einer Vielzahl von nicht interoperablen Implementierungen.

  • Interoperabilität: Das Hinzufügen zu vieler Erweiterungspunkte in der Spezifikation führte zu Implementierungen, die nicht miteinander kompatibel sind. Dies bedeutet, dass Sie nicht hoffen können, einen generischen Code zu schreiben, der verwendet wird Endpunkterkennung Um die Endpunkte zu kennen, die von den verschiedenen Implementierungen bereitgestellt werden, und um mit ihnen zu interagieren, müssen Sie stattdessen separate Codes für Facebook, Google, Salesforce usw. schreiben. Selbst die Spezifikation lässt dieses Versagen als Haftungsausschluss zu.
  • Kurze lebende Token: Die Spezifikation bestimmt nicht die Lebensdauer und den Umfang der ausgegebenen Token. Die Implementierung ist frei, um ein Token für immer zu haben. Die meisten Implementierungen bieten uns zwar kurzlebige Zugriffstoken und ein Aktualisierungstoken, mit dem ein neues Zugriffstoken abgerufen werden kann.
  • Sicherheit: Die Spezifikation "empfiehlt" nur die Verwendung von SSL / TLS, während die Token im Klartext über das Kabel gesendet werden. Allerdings ist es für jede wichtige Implementierung erforderlich, dass sichere Endpunkte für die Autorisierung erforderlich sind. Außerdem muss der Client über eine sichere Weiterleitungs-URL verfügen. Andernfalls ist es für einen Angreifer viel zu einfach, die Kommunikation zu überwachen und die Token zu entschlüsseln.

Die hässliche Spat

Die IETF benötigte 31 Entwurfsversionen und den Rücktritt des Hauptautors / Entwicklers Eran Hammer aus dem Gremium, um die Spezifikation endgültig zu veröffentlichen. Eran löste eine Kontroverse aus, indem er die Spezifikation anrief "ein schlechtes Protokoll und ein Todesfall um tausend Kürzungen". Ihm zufolge war die Verwendung von Inhaber-Token (Senden von Token über SSL ohne Signierung oder sonstige Überprüfung) über den Benutzer von Signaturen (oder MAC-Token), die in OAuth 1.0 zum Signieren der Anforderung verwendet werden, eine schlechte Bewegung und ein Ergebnis der Interessenverteilung zwischen Web- und Unternehmensgemeinschaften.


Schlussbemerkungen

Die Spezifikation lässt sicherlich viele Erweiterungspunkte offen, was zu Implementierungen führt, die zusätzlich zu den bereits definierten Spezifikationen eigene Parameter einführen, und stellt sicher, dass Implementierungen von verschiedenen Anbietern nicht miteinander interagieren können. Aber mit der Beliebtheit und der Akzeptanzrate dieses Frameworks, bei dem jeder Big Player in der Stadt (Google, Twitter, Facebook, Salesforce, Foursquare, Github usw.) ihn so implementiert und optimiert, wie er will, ist OAuth keineswegs ein Misserfolg . In der Tat muss jede Webanwendung, die beabsichtigt, ihre APIs für andere Webanwendungen verfügbar zu machen, eine Form der Authentifizierung und Autorisierung unterstützen, und OAuth passt hier.

Zur weiteren Lektüre

  • OAuth und der Weg zur Hölle
  • OAuth - Eine Einführung
  • RFC 5849 - OAuth1.0 spez
  • RFC 6749 - OAuth2.0 spez