Frage

Ich bin erste Schritte auf den Aufbau einer REST-API für ein Projekt an dem ich arbeite, und es führte mich zu tun, ein wenig Forschung über die beste Möglichkeit zum erstellen einer API mit RoR.Ich finde ziemlich schnell heraus, dass standardmäßig Modelle sind offen für die Welt und kann aufgerufen werden über URL-einfach, indem ich ein ".xml" am Ende der URL und übergabe der entsprechenden Parameter.

So ist dann die nächste Frage kam.Wie sichere ich meine app zu verhindern, dass nicht autorisierte änderungen?In einigen Forschung, fand ich ein paar Artikel reden attr_accessible und attr_protected und wie können Sie genutzt werden.Der bestimmte URL, fand ich reden über diese gepostet wurde, wieder im Mai '07 (hier).

Wie alle Dinge, ruby, bin ich mir sicher, dass sich die Dinge seitdem entwickelt haben.Also meine Frage ist, ist dies immer noch die beste Möglichkeit zum sichern einer REST-API innerhalb RoR?

Wenn nicht, was schlagen Sie vor, entweder ein "neues Projekt" oder ein "vorhandenes Projekt"Szenario?

War es hilfreich?

Lösung

Es gibt mehrere Systeme für API-Anforderungen zu authentifizieren, und sie sind anders als normale Authentifizierung durch Plugins wie restful_authentication bereitgestellt oder acts_as_authenticated. Am wichtigsten ist, werden die Kunden nicht Sitzungen werden beibehalten, so gibt es kein Konzept eines Login ist.

HTTP-Authentifizierung

Sie können die grundlegende HTTP-Authentifizierung verwenden. Dazu API-Clients einen regulären Benutzername und Passwort verwenden und es nur in der URL setzen etwa so:

http://myusername:mypass@www.someapp.com/

Ich glaube, dass restful_authentication dies aus der Box unterstützt, so können Sie ignorieren, ob jemand Ihre App über die API oder über einen Browser verwendet wird.

Ein Nachteil hier ist, dass Sie Benutzer sind gefragt ihre Benutzername und das Passwort im Klartext in jeder Anfrage zu stellen. Durch sie über SSL zu tun, können Sie diese sicher machen.

Ich glaube nicht, habe ich jemals wirklich eine API gesehen, die diese verwendet, though. Es scheint wie eine gute Idee, anständig zu mir, zumal es aus der Box durch die aktuellen Authentifizierungsschemata unterstützt wird, so dass ich weiß nicht, was das Problem ist.

API Key

Eine weitere einfache Möglichkeit API-Authentifizierung zu aktivieren ist API-Schlüssel zu verwenden. Es ist im Wesentlichen ein Benutzername für einen Remote-Service. Wenn jemand meldet sich Ihre API zu verwenden, können Sie sie einen API-Schlüssel geben. Dies muss mit jeder Anforderung übergeben werden.

Ein Nachteil hier ist, dass, wenn jemand jemand anderes API-Schlüssel bekommt, sie Anfragen als diesen Benutzer zu machen. Ich denke, dass HTTPS, indem sie alle Ihre API-Anfragen (SSL), können Sie dieses Risiko etwas ausgleichen können.

Ein weiterer Nachteil ist, dass die Benutzer die gleichen Authentifizierungsinformationen (der API-Schlüssel) verwenden überall sie gehen. Wenn sie Zugang zu einem API-Client zu widerrufen wollen, dass ihre einzige Möglichkeit ist, ihren API-Schlüssel zu ändern, die alle anderen Kunden als auch deaktivieren werden. Dies kann durch den Benutzer gemildert werden, um mehr API-Schlüssel zu generieren.

API Key + Secret Key Unterzeichnung

Veraltet (Art) - siehe OAuth unter

Deutlich komplexer ist die Unterzeichnung der Anforderung mit einem geheimen Schlüssel. Dies ist, was Amazon Web Services (S3, EC2, und so tun). Im Wesentlichen geben Sie den Benutzer 2 Schlüssel: ihr API-Schlüssel (. Dh Benutzername) und ihre geheimen Schlüssel (dh Passwort.). Der API-Schlüssel wird mit jeder Anforderung übertragen, aber der geheime Schlüssel nicht. Stattdessen wird es verwendet, um jede Anfrage zu unterschreiben, in der Regel durch einen anderen Parameter hinzugefügt wird.

IIRC, erreicht Amazon dies durch alle Parameter auf die Anforderung nehmen und sie durch Parameternamen zu bestellen. Dann wird diese Zeichenfolge gehasht, um den geheimen Schlüssel als Hash-Schlüssel des Benutzers verwendet wird. Dieser neue Wert wird als ein neuer Parameter auf die Anforderung angehängt, bevor gesendet wird. Auf Amazon Seite, sie tun das gleiche. Sie nehmen alle Parameter (mit Ausnahme der Unterschrift), bestellen sie und Hash den geheimen Schlüssel verwenden. Wenn dies die Signatur übereinstimmt, weiß, dass sie die Anforderung legitim ist.

Der Nachteil hier ist die Komplexität. diese Regelung immer richtig zu arbeiten, ist ein Schmerz, sowohl für den API-Entwickler und die Clients. Erwarten Sie viel Support-Anrufe und wütend E-Mails von Client-Entwickler, die die Dinge nicht bekommen zu arbeiten.

OAuth

, um einige der Komplexität Probleme mit Schlüssel + geheimen Unterschrifts zu bekämpfen, ein Standard namens hat sich OAuth . Im Kern OAuth ist ein Geschmack der Schlüssel + geheimen Unterschrifts, aber viel davon ist standardisiert und hat sich in Bibliotheken für viele Sprachen aufgenommen .

Im Allgemeinen ist es viel einfacher sowohl auf die API-Herstellern und Verbrauchern OAuth zu verwenden, anstatt ein eigenes Schlüssel / Signatursystem zu schaffen.

OAuth auch von Natur aus Segmenten Zugriff, verschiedene Zugriffsberechtigungen für jeden API Verbraucher bereitstellt. Dies ermöglicht es Benutzern, selektiv Zugriff widerrufen, ohne ihre anderen nutzenden Anwendungen zu beeinflussen.

Speziell für Ruby gibt es einen

Andere Tipps

  

Wie sichere ich meine App zu verhindern   nicht autorisierte Änderungen?

attr_accessible und attr_protected sind sowohl nützlich zur Steuerung der Fähigkeit Massenzuordnungen auf einem Active Modell auszuführen. Sie wollen auf jeden Fall attr_protected verwenden Form-Injection-Angriffe zu verhindern; finden Sie unter Verwenden attr_protected oder wir Sie hacken .

Auch, um jemanden zu verhindern, daß die Controller in Ihrer Rails-Anwendung zugreifen kann, sind Sie fast sicher gehen irgendeine Art von Benutzerauthentifizierungssystem benötigen und eine before_filter in Ihrem Controller, um sicherzustellen, dass Sie eine Genehmigung erhalten haben Benutzer, der die Anforderung, bevor Sie die angeforderten Controller-Aktion ausführen lassen.

Siehe Ruby on Rails Security Guide (Teil des Projektes Rails Dokumentation) für Tonnen weitere hilfreiche Informationen.

Ich bin vor ähnliche Fragen wie Sie im Moment, weil ich auch ein REST-api für eine Rails-Anwendung Aufbau aus bin.

Ich schlage vor, um sicherzustellen, dass nur die Attribute können bearbeitet werden Benutzer mit attr_accessible markiert sind. Dies wird eine weiße Liste der Attribute einrichten, die mit update_attributes zugeordnet werden kann.

Was ich tue, ist so etwas wie folgt aus:

   class Model < ActiveRecord::Base  
       attr_accessible nil  
   end

Alle meine Modelle erben davon, so dass sie gezwungen sind, attr_accessible für alle Felder zu definieren, sie Masse zuordenbar machen wollen. Ich persönlich wünschte, es gäbe eine Möglichkeit, dieses Verhalten standardmäßig zu aktivieren (es auch sein mag, und ich weiß nicht darüber).

Nur damit Sie jemand kennen kann Masse eine Eigenschaft zuweisen, nicht nur den REST-API verwenden, sondern auch eine regelmäßige Form Post verwendet wird.

Ein weiterer Ansatz, spart Gebäude viel von dem Zeug selbst ist, etwas zu verwenden wie http://www.3scale.net/ die Griffe Schlüssel, Token, Quoten etc.für einzelne Entwickler.Es tut auch analytics und erstellt ein Entwickler-portal.

Es gibt eine ruby/rails-plugin ruby-API-plugin gelten die Richtlinien für den Verkehr, wie es kommt - Sie können es verwenden in Verbindung mit der oAuth gem.Sie können auch uns ist es durch löschen von Lack vor der Anwendung und verwenden Sie den Lack lib mod: Lack-API-Modul.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top