2009-05-11 10 views
35

Ich habe eine einfache REST JSON-API für andere Websites/Apps, um auf einige der Datenbank meiner Website zuzugreifen (über ein PHP-Gateway). Grundsätzlich funktioniert der Dienst folgendermaßen: 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, die ich auf diesen Dienst zugreifen darf. Mit einem einfachen API-Schlüsselsystem könnte jede Website schnell einen Schlüssel erreichen, indem sie den Schlüssel vom (potentiell) clientseitigen Code einer autorisierten Website kopiert. Ich habe OAuth angeschaut, aber es erscheint ein wenig kompliziert für das, was ich mache. Lösungen?Einfaches, sicheres API-Authentifizierungssystem

+0

HTTP-Standardauthentifizierung über HTTPS. – Petah

Antwort

4

Wenn jemand clientseitige Code kompromittiert ist, sollten sie einen neuen Schlüssel erhalten. Sie können nicht viel tun, wenn ihr Code offengelegt wird.

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

Ich bin mir nicht sicher, was Sie mit einem "einfachen API-Schlüssel" meinen, aber Sie sollten eine Art von Authentifizierung mit privaten Schlüsseln (nur für Client und Server bekannt) verwenden und dann eine Art Prüfsummenalgorithmus durchführen auf die Daten, um sicherzustellen, dass der Kunde tatsächlich ist, wer Sie denken, dass es ist, und dass die Daten nicht auf der Durchreise geändert wurden. Amazon AWS ist ein großartiges Beispiel dafür.

Ich denke, es kann etwas streng sein, um zu garantieren, dass der Code auf der Seite Ihrer Kunden nicht kompromittiert wurde. Ich denke, es ist sinnvoll, Ihren Kunden Verantwortung für die Sicherheit ihrer eigenen Daten zu übertragen. Dies setzt natürlich voraus, dass ein Angreifer nur das Konto dieses Kunden durcheinander bringen kann.

Vielleicht könnten Sie ein Protokoll darüber führen, welche IP-Anfragen von einem bestimmten Konto kommen, und wenn eine neue IP-Adresse kommt, markieren Sie das Konto, senden Sie eine E-Mail an den Client und bitten Sie sie, diese IP zu autorisieren. Ich weiß nicht, ob so etwas funktionieren könnte.

2

Grundsätzlich haben Sie zwei Optionen, entweder den Zugriff per IP beschränken oder dann einen API-Schlüssel haben, beide Optionen 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 definieren, welche Dienste von Drittanbietern auf Ihren Dienst zugreifen dürfen, ohne dass sie dazu gezwungen werden, spezielle Authentifizierungsfunktionen zu implementieren. Das Problem bei dieser Methode besteht jedoch darin, dass, wenn der Drittanbieterdienst beispielsweise vollständig in JavaScript geschrieben wird, die IP der eingehenden Anforderung nicht die IP des Drittanbieterdienstes ist, sondern die IP des Benutzers, wenn die Anforderung erfolgt vom Browser des Benutzers und nicht vom Server. Die Verwendung von IP-Restriktionen wird es daher unmöglich machen, Client-gesteuerte Anwendungen zu schreiben und zwingt alle Anfragen mit geeigneten Zugriffsrechten durch den Server zu gehen. Denken Sie daran, dass IP-Adressen auch gefälscht werden können. Der Vorteil bei API-Schlüsseln besteht darin, dass Sie keine Liste bekannter IPs verwalten müssen, sondern eine Liste von API-Schlüsseln verwalten müssen. Die Wartung ist jedoch einfacher zu automatisieren. Grundsätzlich funktioniert das so, dass Sie zwei Schlüssel haben, zum Beispiel eine Benutzerkennung und ein geheimes Passwort. Jede Methodenanforderung an Ihren Dienst sollte einen Authentifizierungshash bereitstellen, der aus den Anforderungsparametern, der Benutzer-ID und einem Hash dieser Werte besteht (wobei das Secrect-Passwort als Hash-Salz verwendet wird). Auf diese Weise können Sie den Zugriff sowohl authentifizieren als auch einschränken. Das Problem dabei ist, dass, wenn der 3rd-Party-Service als clientgesteuert geschrieben ist (zum Beispiel JavaScript oder ActionScript), jeder Benutzer die User-ID und die geheimen Salt-Werte aus dem Code auslesen kann. Wenn Sie sichergehen möchten, dass nur die wenigen Dienste, die Sie speziell definiert haben, auf Ihren Dienst zugreifen können, besteht die einzige Option darin, die IP-Beschränkung zu verwenden und somit alle Anfragen über ihre Server zu routen .Wenn Sie einen API-Schlüssel verwenden, können Sie dies nicht erzwingen.

28

Sie sollten OAuth verwenden.

Es gibt eigentlich zwei OAuth-Spezifikationen, die 3-legged Version und die 2-legged Version. Die 3-legged Version ist die, die die meiste Aufmerksamkeit bekommt, und es ist nicht die Sie verwenden möchten.

Die gute Nachricht ist, dass die 2-legged-Version genau das tut, was Sie wollen. Sie ermöglicht einer Anwendung den Zugriff auf einen anderen über einen gemeinsamen geheimen Schlüssel (ähnlich dem Web-Service-Modell von Amazon). SHA1 Signing-Methode) oder über ein öffentliches/privates Schlüsselsystem (Signiermethode: RSA-SHA1). Die schlechte Nachricht ist, dass es bei weitem noch nicht so gut unterstützt wird wie die 3-beinige Version, also musst du vielleicht etwas mehr Arbeit machen, als du es sonst vielleicht tun würdest.

Im Grunde gibt 2-legged OAuth nur eine Möglichkeit vor, mehrere Felder zu "signieren" (berechnen Sie einen Hash über), die das aktuelle Datum, eine Zufallszahl namens "nonce" und die Parameter Ihrer Anfrage enthalten. Dies macht es sehr schwer, um Anfragen an Ihren Web-Service zu imitieren.

OAuth entwickelt sich langsam, aber sicher zu einem akzeptierten Standard für solche Dinge - Sie werden auf lange Sicht am besten davon profitieren, wenn Sie sich dafür entscheiden, weil die Leute dann die verschiedenen dafür verfügbaren Bibliotheken nutzen können.

Es ist aufwendiger, als Sie ursprünglich wollen - 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 der die Community gerade arbeitet. Wenn Sie Ihr eigenes System erfunden haben, müssen Sie all diese Dinge selbst herausfinden.

Viel Glück!

Chris

21

OAuth ist nicht die Lösung hier.
OAuth ist, wenn Sie Enduser haben und möchten, dass Drittanbieter-Apps keine Endbenutzerkennwörter verarbeiten. Bei OAuth verwenden: http://blog.apigee.com/detail/when_to_use_oauth/

Go für einfache api-Schlüssel.
Und ergreifen Sie zusätzliche Maßnahmen, wenn Sie eine sicherere Lösung benötigen.

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

+0

LOL: Der Link zu blog.apigee.com ist defekt und zeigt "Zugriff verweigert: Sie sind nicht berechtigt, auf diese Seite zuzugreifen." Aber es ist aus dem Jahr 2009 sowieso, also nicht sicher, wie relevant die Info war ... – auco

+1

Hier ist ein Internet Archive Link, wenn jemand noch interessiert ist (ich noch dachte, es war): https://web.archive.org/web/ 20140708081525/https: //blog.apigee.com/detail/do_you_need_api_keys_api_identity_vs._authorization – Gerard

0

der Produktion von IP-Sicherheit Alles scheint einen riesigen Fehler zu Benutzern produziert vor immer verbunden. Symbian 60s hat die größte Fähigkeit, ein nicht erkanntes, zuverlässiges und sicheres Signal inmitten mehrerer Benutzer (unter Verwendung von Opera Handler UI 6.5, Opera Mini v8 und 10) zusammen mit den codierten UI's + vollständig gefüllten Netzwerkeinstellungen zu hinterlassen. Warum sollte man sich auf andere Merkmale beschränken, wenn man schließlich die Methode der schnelleren Verbindungsmethode finden kann? Ein besser definiertes Konto, eine korrekte Überwachung dieses "wahren Kontos" - wenn sie auf der Spur sind - die Einhaltung von Rechnungen und das Wissen, ob die Benutzer ein nicht abgelaufenes Konto haben, wird eine schnellere Verbindung zwischen Internetsignal und populärem/signiertem Mobiltelefon schaffen Industrie. Warum sollten harte Sicherheitsfeatures erstellt werden, bevor sie auf die Website gelangen? Wenn Sie ihre Konten monatlich besuchen, werden möglicherweise alle Verbindungsprobleme gelöscht. Alle Benutzer von Mobilgeräten sollten nicht in der Lage sein, Verbindungen herzustellen, wenn sie unbezahlte Rechnungen haben.Warum nicht ein "ALL-in-One" -Registrierungs-/Anwendungskonto bereitstellen, ein mit dem Betriebssystem fest programmiertes Programm (vielleicht ein E-Mail-Konto) statt mit einer "Überwachungsfunktion", wenn sie zahlen oder nicht (Passwortprobleme betreffen) zu anderer Abteilung). Und wenn 'nicht' ihren Account genau abstellt und ihre anderen Linkfeatures. Jeder von ihnen hat seine eigenen Interessen, wo man täglich süchtig werden kann, wenn man sie wegen unbezahlter Rechnungen gesperrt oder abgeschaltet hat, die sie dazu bringen könnten, sie erneut zu abonnieren und sie mehr zu disziplinieren, damit sie zu verantwortungsvolleren Benutzern werden ein Konto, wenn es nicht gepflegt wird. Die monatliche Überwachung oder der Zugriff auf ein identifiziertes "echtes Konto" bei der Zusammenarbeit mit dem Netzwerkanbieter führt zu mehr Privatsphäre statt immer nach dem Namen, dem Passwort, dem Standort, den Berechtigungen für die Anzeige ihrer Datendienste zu fragen. IPs markiert bereits ihre erste Identität oder "den Standort der Benutzer zu finden", so scheint es unnötig, sie auf Browser-Vor-Suchen zu platzieren, warum nicht "Daten beschaffen" oder "Daten verarbeiten" verwenden.

+0

vielleicht möchten Sie Ihre Antwort in Blöcke restrukturieren Lesbarkeit zu verbessern. – Jendas