it-swarm.com.de

Einfaches, sicheres API-Authentifizierungssystem

Ich habe eine einfache REST JSON-API für andere Websites/Apps, um auf einen Teil der Datenbank meiner Website zuzugreifen (über ein PHP Gateway). Grundsätzlich funktioniert der Dienst wie folgt: Rufen Sie example.com/fruit/orange auf. Der Server gibt JSON-Informationen über die Orange zurück. Hier ist das Problem: Ich möchte nur Websites, denen ich den Zugriff auf diesen Dienst gestatte. Mit einem einfachen API-Schlüsselsystem kann jede Website schnell einen Schlüssel erhalten, indem der Schlüssel aus dem (potenziellen) clientseitigen Code einer autorisierten Website kopiert wird. Ich habe OAuth angeschaut, aber es scheint ein wenig kompliziert für das, was ich tue. Lösungen?

35
Russ

Sie sollten OAuth verwenden.

Es gibt tatsächlich zwei OAuth-Spezifikationen, die Version mit drei Beinen und die Version mit zwei Beinen. Die 3-beinige Version ist diejenige, die die meiste Aufmerksamkeit auf sich zieht, und sie ist nicht diejenige, die Sie verwenden möchten.

Die gute Nachricht ist, dass die zweibeinige Version genau das tut, was Sie möchten. Sie ermöglicht es einer Anwendung, über einen gemeinsamen geheimen Schlüssel Zugriff auf eine andere zu gewähren. (Ähnlich wie beim Webdienstmodell von Amazon verwenden Sie die HMAC-SHA1-Signaturmethode.) oder über ein öffentliches/privates Schlüsselsystem (Signaturmethode verwenden: RSA-SHA1). Die schlechte Nachricht ist, dass es noch nicht annähernd so gut unterstützt wird wie die 3-beinige Version, so dass Sie möglicherweise ein bisschen mehr Arbeit leisten müssen, als Sie es sonst im Moment tun müssten.

Grundsätzlich gibt OAuth mit zwei Beinen nur eine Möglichkeit an, mehrere Felder zu "signieren" (einen Hash zu berechnen), einschließlich des aktuellen Datums, einer Zufallszahl namens "nonce" und der Parameter Ihrer Anfrage. Dies macht es sehr schwer schwierig, Anfragen an Ihren Webservice zu stellen.

OAuth wird langsam aber sicher zu einem akzeptierten Standard für diese Art von Dingen - Sie werden auf lange Sicht am besten dran sein, wenn Sie es annehmen, weil die Leute dann die verschiedenen Bibliotheken nutzen können, die dafür zur Verfügung stehen.

Es ist aufwändiger, als Sie sich zunächst wünschen würden - aber die gute Nachricht ist, dass viele Leute viel Zeit damit verbracht haben, damit Sie wissen, dass Sie nichts vergessen haben. Ein gutes Beispiel ist, dass Twitter kürzlich eine Lücke in der OAuth-Sicherheit gefunden hat, an deren Schließung die Community derzeit arbeitet. Wenn Sie Ihr eigenes System erfunden hätten, müssten Sie all diese Dinge selbst herausfinden.

Viel Glück!

Chris

28
Chris Harris

OAuth ist hier nicht die Lösung .
OAuth ist, wenn Sie Endbenutzer haben und möchten, dass Apps von Drittanbietern keine Endbenutzerkennwörter verarbeiten. Verwendung von OAuth: http://blog.apigee.com/detail/when_to_use_oauth/

Rufe einen einfachen API-Schlüssel auf .
Und ergreift zusätzliche Maßnahmen, wenn eine sicherere Lösung erforderlich ist.

Hier einige weitere Informationen, http://blog.apigee.com/detail/do_you_need_api_keys_api_identity_vs._authorization/

21

Wenn der clientseitige Code einer Person kompromittiert ist, sollte sie einen neuen Schlüssel erhalten. Es gibt nicht viel, was Sie tun können, wenn der Code verfügbar gemacht wird.

Sie können jedoch strenger vorgehen, indem Sie verlangen, dass IP-Adressen autorisierter Server für den angegebenen Schlüssel in Ihrem System registriert sind. Dies fügt einen zusätzlichen Schritt hinzu und kann übertrieben sein.

Ich bin nicht sicher, was Sie mit einem "einfachen API-Schlüssel" meinen, aber Sie sollten eine Art Authentifizierung mit privaten Schlüsseln (nur Client und Server bekannt) verwenden und dann eine Art Prüfsummenalgorithmus für die Daten ausführen Stellen Sie sicher, dass der Kunde tatsächlich der ist, für den Sie ihn halten, und dass die Daten während der Übertragung nicht geändert wurden. Amazon AWS ist ein großartiges Beispiel dafür.

Ich denke, es kann ein bisschen streng sein, zu garantieren, dass der Code auf der Seite Ihrer Kunden nicht kompromittiert wurde. Ich halte es für angemessen, die Verantwortung für die Sicherheit der eigenen Daten bei Ihren Kunden zu übernehmen. Dies setzt natürlich voraus, dass ein Angreifer nur das Konto dieses Kunden durcheinander bringen kann.

Vielleicht können Sie ein Protokoll darüber führen, von welchen IP-Anfragen ein bestimmtes Konto stammt. Wenn eine neue IP-Adresse eingeht, markieren Sie das Konto, senden Sie eine E-Mail an den Client und bitten Sie ihn, diese IP-Adresse zu autorisieren. Ich weiß nicht, ob so etwas funktionieren könnte.

4
Kekoa

Grundsätzlich haben Sie zwei Möglichkeiten, entweder den Zugriff per IP einzuschränken oder dann über einen API-Schlüssel zu verfügen. Beide Möglichkeiten haben ihre positiven und negativen Seiten.

Einschränkung durch IP
Dies kann eine praktische Möglichkeit sein, den Zugriff auf Ihren Dienst einzuschränken. Sie können genau festlegen, welche Dienste von Drittanbietern auf Ihren Dienst zugreifen dürfen, ohne dass sie spezielle Authentifizierungsfunktionen implementieren müssen. Das Problem bei dieser Methode ist jedoch, dass, wenn der Drittanbieter-Dienst beispielsweise vollständig in JavaScript geschrieben ist, die IP der eingehenden Anforderung nicht die Server-IP des Drittanbieter-Diensts ist, sondern die IP des Benutzers, wenn die Anforderung gestellt wird vom Browser des Benutzers und nicht vom Server. Die Verwendung der IP-Beschränkung macht es daher unmöglich, clientgesteuerte Anwendungen zu schreiben, und erzwingt, dass alle Anforderungen mit den richtigen Zugriffsrechten über den Server gesendet werden. Denken Sie daran, dass IP-Adressen auch gefälscht werden können.

API-Schlüssel
Der Vorteil von API-Schlüsseln besteht darin, dass Sie keine Liste bekannter IP-Adressen verwalten müssen, sondern eine Liste von API-Schlüsseln, die jedoch einfacher zu automatisieren sind. Grundsätzlich funktioniert dies so, dass Sie zwei Schlüssel haben, zum Beispiel eine Benutzer-ID und ein geheimes Passwort. Jede Methodenanforderung an Ihren Dienst sollte einen Authentifizierungs-Hash enthalten, der aus den Anforderungsparametern, der Benutzer-ID und einem Hash dieser Werte besteht (wobei das sichere Kennwort als Hash-Salt verwendet wird). Auf diese Weise können Sie den Zugriff sowohl authentifizieren als auch einschränken. Das Problem dabei ist, dass, wenn der Drittanbieter-Service als clientgesteuert geschrieben ist (z. B. JavaScript oder ActionScript), jeder die Benutzer-ID und die geheimen Salt-Werte aus dem Code auslesen kann.

Wenn Sie sicherstellen möchten, dass nur die wenigen von Ihnen definierten Dienste auf Ihren Dienst zugreifen können, können Sie nur die IP-Beschränkung verwenden und sie daher zwingen, alle Anforderungen über ihre Server weiterzuleiten. Wenn Sie einen API-Schlüssel verwenden, können Sie dies nicht erzwingen.

2
Kim L

Die gesamte Produktion der IP-Sicherheit scheint einen riesigen Fehler für die Benutzer zu verursachen, bevor eine Verbindung hergestellt wird. Symbian 60s bietet die umfassendste Möglichkeit, ein nicht verfolgtes, zuverlässiges und sicheres Signal bei mehreren Benutzern zu hinterlassen (unter Verwendung von Opera Handler UI 6.5, Opera Mini v8 und 10), zusammen mit der + vollständig ausgefüllten Netzwerkeinrichtung der codierten Benutzeroberfläche. Warum für andere Funktionen einschränken, wenn endlich eine auffindbare Methode zur Herstellung einer schnelleren Verbindungsmethode erhalten wird? Durch die Führung identifizierterer Konten, die ordnungsgemäße Überwachung dieses „echten Kontos“ - sofern die Einhaltung der Vorschriften für das Bezahlen von Rechnungen gewährleistet ist - und das Wissen, ob der Benutzer über ein nicht abgelaufenes Guthaben verfügt, wird eine schnellere Verbindung des Internet-Signals mit dem beliebten/signierten Mobiltelefon hergestellt Industrie. Warum können bei einem monatlichen Besuch der Konten alle Konnektivitätsprobleme behoben werden, wenn Sicherheitsfunktionen ausgeführt werden, bevor sie auf die Website gelangen? Alle Benutzer von Mobiltelefonen sollten nicht in der Lage sein, eine Verbindung herzustellen, wenn sie nicht bezahlte Rechnungen haben. Warum nicht ein "ALL in One" -Registrierungs-/Anwendungskonto, ein mit dem Betriebssystem fest programmiertes Konto (möglicherweise ein E-Mail-Konto) stattdessen mit einer "Überwachungsfunktion" versehen, wenn sie bezahlen oder nicht (Kennwortprobleme betreffen), sollte angegeben werden? zu einer anderen Abteilung). Und wenn nicht, schalten Sie den Account und die anderen Link-Funktionen ab. Jeder von ihnen hat seine eigenen Interessen, wenn Sie ihn wegen unbezahlter Rechnungen sperren oder ausschalten möchten, was dazu führen kann, dass er ihn erneut abonniert und diszipliniert, um ein verantwortungsbewussterer Benutzer zu werden, und das kann sogar verfallen ein Konto, wenn nicht gepflegt. Das monatliche Überwachen oder Zugreifen auf einen identifizierten "echten Account" in Zusammenarbeit mit dem Netzwerkanbieter führt zu einer höheren Vertraulichkeit, anstatt immer nach dem Namen und dem Kennwort des Benutzers, dem Standort und den Berechtigungen zum Anzeigen seiner Datendienste zu fragen. IPs haben bereits ihre erste Identität markiert oder 'den Standort der Benutzer finden'. Es erscheint daher unnötig, sie in den Vorsuchen des Browsers zu platzieren. Warum nicht 'Daten abrufen' oder 'Daten verarbeiten' verwenden?

0
Marlon