Hintergrund: Ich habe Client- und Server-Stacks für OAuth 1.0a und 2.0 geschrieben.
Sowohl OAuth 1.0a als auch 2.0 unterstützen die zweibeinige Authentifizierung , bei der einem Server die Identität eines Benutzers zugesichert wird, und die dreibeinige Authentifizierung , bei der ein Server von einem Inhaltsanbieter der Identität des Benutzers sichergestellt wird. Bei der dreibeinigen Authentifizierung kommen Autorisierungsanfragen und Zugriffstoken ins Spiel, und es ist wichtig zu beachten, dass OAuth 1 diese auch hat.
Das Komplexe: Dreibeinige Authentifizierung
Ein Hauptpunkt der OAuth-Spezifikationen besteht darin, dass ein Inhaltsanbieter (z. B. Facebook, Twitter usw.) einem Server (z. B. einer Web-App, die im Namen des Kunden mit dem Inhaltsanbieter sprechen möchte ) versichert, dass der Kunde eine Identität hat . Die dreibeinige Authentifizierung bietet die Möglichkeit, dies zu tun, ohne dass der Client oder Server jemals die Details dieser Identität (z. B. Benutzername und Kennwort) kennen muss.
Ohne (?) Zu tief in die Details von OAuth einzudringen:
- Der Client sendet eine Autorisierungsanforderung an den Server, die bestätigt, dass der Client ein legitimer Client seines Dienstes ist.
- Der Server leitet den Client an den Inhaltsanbieter weiter, um den Zugriff auf seine Ressourcen anzufordern.
- Der Inhaltsanbieter überprüft die Identität des Benutzers und fordert häufig dessen Erlaubnis zum Zugriff auf die Ressourcen an.
- Der Inhaltsanbieter leitet den Client zurück zum Server und benachrichtigt ihn über Erfolg oder Misserfolg. Diese Anfrage enthält einen Autorisierungscode für den Erfolg.
- Der Server sendet eine Out-of-Band-Anfrage an den Inhaltsanbieter und tauscht den Autorisierungscode gegen ein Zugriffstoken aus.
Der Server kann nun im Namen des Benutzers Anforderungen an den Inhaltsanbieter stellen, indem er das Zugriffstoken übergibt.
Jeder Austausch (Client-> Server, Server-> Inhaltsanbieter) beinhaltet die Validierung eines gemeinsam genutzten Geheimnisses. Da OAuth 1 jedoch über eine unverschlüsselte Verbindung ausgeführt werden kann, kann jede Validierung das Geheimnis nicht über die Leitung weitergeben.
Wie Sie bereits bemerkt haben, geschieht dies mit HMAC. Der Client verwendet das Geheimnis, das er mit dem Server teilt, um die Argumente für seine Autorisierungsanforderung zu signieren. Der Server nimmt die Argumente entgegen, signiert sie selbst mit dem Schlüssel des Clients und kann feststellen, ob es sich um einen legitimen Client handelt (siehe Schritt 1 oben).
Für diese Signatur müssen sich sowohl der Client als auch der Server auf die Reihenfolge der Argumente einigen (damit sie genau dieselbe Zeichenfolge signieren). Eine der Hauptbeschwerden bei OAuth 1 besteht darin, dass sowohl der Server als auch die Clients sortieren und Zeichen identisch. Dies ist fummeliger Code und entweder ist es richtig oder Sie bekommen 401 Unauthorized
mit wenig Hilfe. Dies erhöht die Barriere für das Schreiben eines Kunden.
Durch die Anforderung, dass die Autorisierungsanforderung über SSL ausgeführt werden muss, entfällt für OAuth 2.0 das Sortieren und Signieren von Argumenten insgesamt. Der Client gibt sein Geheimnis an den Server weiter, der es direkt überprüft.
Die gleichen Anforderungen gelten für die Verbindung zwischen Server und Inhaltsanbieter. Da dies SSL ist, wird eine Barriere für das Schreiben eines Servers, der auf OAuth-Dienste zugreift, beseitigt.
Dies erleichtert die Arbeit in den obigen Schritten 1, 2 und 5 erheblich.
Zu diesem Zeitpunkt verfügt unser Server über ein permanentes Zugriffstoken, das einem Benutzernamen / Kennwort entspricht, das dem Benutzer entspricht. Es kann im Namen des Benutzers Anforderungen an den Inhaltsanbieter stellen, indem dieses Zugriffstoken als Teil der Anforderung übergeben wird (als Abfrageargument, HTTP-Header oder POST-Formulardaten).
Wenn auf den Inhaltsdienst nur über SSL zugegriffen wird, sind wir fertig. Wenn es über einfaches HTTP verfügbar ist, möchten wir dieses permanente Zugriffstoken auf irgendeine Weise schützen. Jeder, der an der Verbindung schnüffelt, kann für immer auf den Inhalt des Benutzers zugreifen.
Die Lösung in OAuth 2 erfolgt mit einem Aktualisierungstoken . Das Aktualisierungstoken wird zum permanenten Kennwortäquivalent und wird immer nur über SSL übertragen . Wenn der Server Zugriff auf den Inhaltsdienst benötigt, tauscht er das Aktualisierungstoken gegen ein kurzlebiges Zugriffstoken aus. Auf diese Weise werden alle schnüffelbaren HTTP-Zugriffe mit einem Token ausgeführt, das abläuft. Google verwendet für seine OAuth 2-APIs einen Ablauf von 5 Minuten.
Abgesehen von den Aktualisierungstoken vereinfacht OAuth 2 die gesamte Kommunikation zwischen Client, Server und Inhaltsanbieter. Die Aktualisierungstoken sind nur vorhanden, um Sicherheit zu bieten, wenn unverschlüsselt auf Inhalte zugegriffen wird.
Zweibeinige Authentifizierung
Manchmal muss ein Server jedoch nur den Zugriff auf seinen eigenen Inhalt steuern. Durch die zweibeinige Authentifizierung kann der Client den Benutzer direkt beim Server authentifizieren.
OAuth 2 standardisiert einige Erweiterungen von OAuth 1, die weit verbreitet waren. Die, die ich am besten kenne, wurde von Twitter als xAuth eingeführt . Sie können es in OAuth 2 als Kennwortanmeldeinformationen für Ressourcenbesitzer anzeigen .
Wenn Sie dem Client die Anmeldeinformationen des Benutzers (Benutzername und Kennwort) anvertrauen können, können diese diese im Wesentlichen direkt mit dem Inhaltsanbieter gegen ein Zugriffstoken austauschen. Dies macht OAuth für mobile Apps viel nützlicher. Bei der dreibeinigen Authentifizierung müssen Sie eine HTTP-Ansicht einbetten, um den Autorisierungsprozess mit dem Inhaltsserver abzuwickeln.
Bei OAuth 1 war dies nicht Teil des offiziellen Standards und erforderte dasselbe Signaturverfahren wie alle anderen Anforderungen.
Ich habe gerade die Serverseite von OAuth 2 mit Kennwortanmeldeinformationen für Ressourceneigentümer implementiert, und aus Sicht eines Clients ist das Abrufen des Zugriffstokens einfach geworden: Fordern Sie ein Zugriffstoken vom Server an und übergeben Sie die Client-ID / das Client-Geheimnis als HTTP-Autorisierungsheader und das Login / Passwort des Benutzers als Formulardaten.
Vorteil: Einfachheit
Aus Sicht eines Implementierers sind die Hauptvorteile, die ich in OAuth 2 sehe, die geringere Komplexität. Das Anforderungssignierungsverfahren ist nicht erforderlich, was nicht gerade schwierig, aber sicherlich umständlich ist. Dies reduziert den Arbeitsaufwand als Kunde eines Dienstes erheblich. Hier möchten Sie (in der modernen, mobilen Welt) die Schmerzen am meisten minimieren. Die reduzierte Komplexität auf der Seite des Server-> Inhaltsanbieters macht es im Rechenzentrum skalierbarer.
Und es kodifiziert einige Erweiterungen von OAuth 1.0a (wie xAuth) in den Standard, die jetzt weit verbreitet sind.