webentwicklung-frage-antwort-db.com.de

API-Schlüssel vs HTTP-Authentifizierung vs OAuth in einer RESTful-API

Ich arbeite daran, eine RESTful-API für eine der von mir verwalteten Anwendungen zu erstellen. Wir sind derzeit bemüht, verschiedene Dinge zu integrieren, die einen kontrollierten Zugriff und mehr Sicherheit erfordern. Während der Recherche zur Sicherung der API habe ich einige unterschiedliche Meinungen dazu gefunden, welche Form zu verwenden ist. Ich habe gesehen, dass einige Quellen sagen, dass HTTP-Auth der richtige Weg ist, während andere API-Schlüssel bevorzugen und sogar andere (einschließlich der Fragen, die ich hier auf SO gefunden habe) auf OAuth schwören.

Diejenigen, die zum Beispiel API-Schlüssel bevorzugen, sagen natürlich, dass OAuth für Anwendungen entwickelt wurde, die im Namen eines Benutzers Zugriff erhalten (wie ich es verstehe, zum Beispiel, wenn sie sich auf einer Nicht-Facebook-Site anmelden Verwenden Ihres Facebook-Kontos) und nicht für einen Benutzer, der direkt auf Ressourcen auf einer Website zugreift, für die er sich speziell angemeldet hat (z. B. der offizielle Twitter-Client, der auf die Twitter-Server zugreift). Die Empfehlungen für OAuth scheinen jedoch auch für die grundlegendsten Authentifizierungsanforderungen zu gelten.

Meine Frage ist also: Unter der Annahme, dass alles über HTTPS erfolgt, was sind einige der praktischen Unterschiede zwischen den drei? Wann sollte man über die anderen nachdenken?

97
Shauna

Es hängt von Ihren Bedürfnissen ab. Brauchst du:

  • Identität - Wer behauptet, eine API-Anfrage zu stellen?
  • Authentifizierung - sind sie wirklich so, wie sie es sagen?
  • Autorisierung - Dürfen sie das tun, was sie versuchen?

oder alle drei?

Wenn Sie nur den Anrufer identifizieren müssen, um das Volumen oder die Anzahl der API-Aufrufe zu verfolgen, verwenden Sie einen einfachen API-Schlüssel. Bedenken Sie, dass der Benutzer, dem Sie den API-Schlüssel ausgestellt haben, ihn mit einer anderen Person teilt, die auch Ihre API aufrufen kann.

Wenn Sie jedoch auch eine Autorisierung benötigen, müssen Sie nur Zugriff auf bestimmte Ressourcen gewähren, die auf dem Aufrufer der API basieren. Verwenden Sie dann oAuth.

Hier ist eine gute Beschreibung: http://www.srimax.com/index.php/do-you-need-api-keys-api-identity-vs-authorization/

65
Sid

API-Schlüssel oder sogar Token fallen in die Kategorie der direkten Authentifizierungs- und Autorisierungsmechanismen, da sie den Zugriff auf offen gelegte Ressourcen der REST APIs gewähren. Solche direkten Mechanismen können in Delegierungsanwendungsfällen verwendet werden.

Um Zugriff auf eine Ressource oder eine Reihe von Ressourcen zu erhalten, die von REST= Endpunkten verfügbar gemacht werden, müssen die Anforderungsberechtigungen anhand ihrer Identität überprüft werden. Der erste Schritt des Workflows besteht darin, die Identität zu überprüfen durch Authentifizierung die Anfrage; Ein weiterer Schritt besteht darin, die Identität anhand eines Satzes definierter Regeln zu prüfen, um Autorisierung die Zugriffsebene (d. h. Lesen, Schreiben oder Lesen/Schreiben) zu bestimmen. Sobald die genannten Schritte abgeschlossen sind, ist ein typisches weiteres Anliegen die erlaubte Anforderungsrate, was bedeutet, wie viele Anforderungen pro Sekunde der Anforderer für die gegebene (n) Ressource (n) ausführen darf.

OAuth (Open Authorization) ist ein Standardprotokoll für delegierten Zugriff, das häufig von großen Internetunternehmen verwendet wird, um den Zugriff ohne Angabe des Kennworts zu gewähren. OAuth ist ein Protokoll, das die oben genannten Bedenken erfüllt: Authentifizierung und Autorisierung durch Bereitstellung eines sicheren delegierten Zugriffs auf Serverressourcen im Namen des Ressourcenbesitzers. Es basiert auf einem Mechanismus für Zugriffstoken, der Folgendes ermöglicht Dies ist die dritte Partei, die im Auftrag des Ressourcenbesitzers Zugriff auf die vom Server verwaltete Ressource erhält. Beispielsweise möchte ServiceX im Auftrag von John auf das Google-Konto von John Smith zugreifen, sobald John die Delegierung autorisiert hat. ServiceX erhält dann eine Zeit lang Zugriff -basiertes Token für den Zugriff auf die Google-Kontodetails, sehr wahrscheinlich nur für den Lesezugriff.

Das Konzept des API-Schlüssels ist dem oben beschriebenen OAuth= Token sehr ähnlich. Der Hauptunterschied besteht in der Abwesenheit einer Delegierung: Der Benutzer fordert den Schlüssel direkt beim Dienstanbieter für aufeinanderfolgende programmatische Interaktionen an des API-Schlüssels ist auch zeitbasiert: Der Schlüssel und das OAuth Token unterliegen einem Time Lease oder Ablaufzeitraum. Als zusätzlicher Aspekt können sowohl der Schlüssel als auch das Token unterliegen Ratenbegrenzung durch Servicevertrag, dh es kann nur eine bestimmte Anzahl von Anfragen pro Sekunde bedient werden.

Zusammenfassend lässt sich sagen, dass es in der Realität keinen wirklichen Unterschied zwischen herkömmlichen Authentifizierungs- und Autorisierungsmechanismen und auf Schlüsseln/Token basierenden Versionen gibt. Das Paradigma ist jedoch etwas anders: Anstatt die Anmeldeinformationen bei jeder Interaktion zwischen Client und Server erneut zu verwenden, wird ein Support-Key/Token verwendet, der die Interaktionserfahrung insgesamt reibungsloser und wahrscheinlich sicherer macht ( Häufig werden Schlüssel und Token nach dem Standard JWT vom Server digital signiert, um das Herstellen zu vermeiden.

  • Direkte Authentifizierung und Autorisierung : Schlüsselbasierte Protokolle als Variante der traditionellen Versionen, die auf Anmeldeinformationen basieren.
  • Delegierte Authentifizierung und Autorisierung : Ähnlich wie bei OAuth-basierten Protokollen, die wiederum Tokens als Variante von Versionen verwenden, die auf Anmeldeinformationen basieren (das allgemeine Ziel wird nicht offengelegt) das Passwort für Dritte).

In beiden Kategorien wird ein herkömmlicher Workflow zur Identitätsprüfung für die allererste Interaktion mit dem Server verwendet, der die interessierte (n) Ressource (n) besitzt.

1
Paolo Maresca