Ich könnte etwas Hilfe für meine REST-API gebrauchen. Ich schreibe eine Node.js-App, die Express und MongoDB verwendet und Backbone.js auf der Clientseite hat. Ich habe die letzten zwei Tage damit verbracht, all das herauszufinden und nicht viel Glück zu haben. Ich habe bereits ausgecheckt:
- Sichern einer REST-API
- Sichern meiner REST-API mit OAuth bei gleichzeitiger Authentifizierung über OAuth-Anbieter von Drittanbietern (mithilfe von DotNetOpenAuth)
- http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
- http://tesoriere.com/2011/10/10/node.js-getting-oauth-up-and-working-using-express.js-and-railway.js/
Ich möchte mein Backend und Frontend so getrennt wie möglich halten, daher habe ich mir überlegt, eine sorgfältig gestaltete REST-API zu verwenden. Ich denke, wenn ich jemals eine iPhone-App (oder etwas Ähnliches) entwickeln sollte, könnte sie die API verwenden, um auf Daten zuzugreifen.
ABER ich möchte, dass dies sicher ist. Ein Benutzer hat sich bei meiner Web-App angemeldet und ich möchte sicherstellen, dass meine API sicher ist. Ich habe über OAuth, OAuth 2.0, OpenID, Hmac, Hashes usw. gelesen. Ich möchte die Verwendung der externen Anmeldung (Facebook / Twitter / usw.) vermeiden. Ich möchte, dass sich die Registrierung und Anmeldung auf meiner App / meinem Server befindet.
... aber ich bin hier immer noch verwirrt. Vielleicht ist es spät in der Nacht oder mein Gehirn ist nur gebraten, aber ich könnte wirklich ein paar Schritte tun, was ich hier tun soll. Was sind die Schritte für mich, um eine sichere API zu erstellen?
Jede Hilfe, jede Information, jedes Beispiel, jeder Schritt oder irgendetwas wäre großartig. Bitte helfen Sie!
quelle
Antworten:
Hier ist eine andere Art, darüber nachzudenken:
Nehmen wir für einen Moment an, dass Sie keine API verwenden. Ihr Benutzer meldet sich bei der App mit einigen Anmeldeinformationen an und Sie geben dem Benutzer ein Cookie oder ein ähnliches Token, mit dem Sie identifizieren, dass sich der Benutzer angemeldet hat. Der Benutzer fordert dann eine Seite mit eingeschränkten Informationen an (oder erstellt / Ändern / Löschen), damit Sie dieses Token überprüfen, um sicherzustellen, dass der Benutzer diese Informationen anzeigen darf.
Nun scheint es mir, dass das einzige, was Sie hier ändern, die Art und Weise ist, wie Informationen geliefert werden. Anstatt die Informationen als gerendertes HTML bereitzustellen, geben Sie die Informationen als JSON zurück und rendern sie auf der Clientseite. Ihre AJAX-Anforderungen an den Server enthalten dasselbe angemeldete Token wie zuvor. Ich empfehle daher, nur dieses Token zu überprüfen und die Informationen auf die gleiche Weise auf "genau das zu beschränken, was der Benutzer wissen darf".
Ihre API ist jetzt so sicher wie Ihre Anmeldung. Wenn jemand das für den Zugriff auf die API erforderliche Token kennen sollte, würde er auch auf der Site angemeldet sein und trotzdem Zugriff auf alle Informationen haben. Das Beste ist, wenn Sie die Anmeldung bereits implementiert haben, mussten Sie nicht mehr wirklich arbeiten.
Bei Systemen wie OAuth geht es darum, diese Anmeldemethode bereitzustellen, normalerweise von einer Drittanbieteranwendung und als Entwickler. Dies wäre möglicherweise eine gute Lösung für eine iPhone-App oder ähnliches, aber das ist in der Zukunft. Es ist nichts Falsches daran, dass die API mehr als eine Authentifizierungsmethode akzeptiert!
quelle
In der Reihenfolge zunehmender Sicherheit / Komplexität:
Grundlegende HTTP-Authentifizierung
In vielen API-Bibliotheken können Sie dies einbauen (z. B. Piston in Django) oder Ihren Webserver damit umgehen lassen. Sowohl Nginx als auch Apache können Serveranweisungen verwenden, um eine Site mit einem einfachen b64-codierten Kennwort zu sichern. Es ist nicht die sicherste Sache der Welt, aber es ist mindestens ein Benutzername und ein Passwort!
Wenn Sie Nginx verwenden, können Sie Ihrer Host-Konfiguration einen Abschnitt wie folgt hinzufügen:
auth_basic "Restricted"; auth_basic_user_file /path/to/htpasswd;
(Steck es in deinen
location /
Block)Dokumente: http://wiki.nginx.org/HttpAuthBasicModule
Sie benötigen das Python-Skript, um dieses Kennwort zu generieren und die Ausgabe in eine Datei zu speichern: http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py?format=txt
Der Speicherort der Datei spielt keine große Rolle, solange Nginx Zugriff darauf hat.
HTTPS
Sichern Sie die Verbindung von Ihrem Server zur App. Dies ist die grundlegendste und verhindert Angriffe von Menschen in der Mitte.
Sie können dies mit Nginx tun, die Dokumente dafür sind sehr umfassend: http://wiki.nginx.org/HttpSslModule
Ein selbstsigniertes Zertifikat hierfür wäre in Ordnung (und kostenlos!).
API-Schlüssel
Diese können in einem beliebigen Format vorliegen, bieten jedoch den Vorteil, dass Sie den Zugriff bei Bedarf widerrufen können. Möglicherweise nicht die perfekte Lösung für Sie, wenn Sie beide Enden der Verbindung entwickeln. Sie werden in der Regel verwendet, wenn Dritte die API verwenden, z. B. Github.
OAuth
OAuth 2.0 ist das Richtige für Sie. Obwohl ich die zugrunde liegende Funktionsweise der Spezifikation nicht kenne, ist sie derzeit der Standard für die meisten Authentifizierungen (Twitter, Facebook, Google usw.), und es gibt eine Menge Bibliotheken und Dokumente, die Ihnen bei der Implementierung helfen. Davon abgesehen wird es normalerweise verwendet, um einen Benutzer zu authentifizieren, indem ein Drittanbieter nach der Authentifizierung gefragt wird.
Angesichts der Tatsache, dass Sie die Entwicklung an beiden Enden durchführen, würde es wahrscheinlich ausreichen, Ihre API hinter Basic HTTP Auth zu stellen und über HTTPS bereitzustellen, insbesondere wenn Sie keine Zeit damit verschwenden möchten, mit OAuth herumzuspielen.
quelle
Die Antworten sind bisher sehr gut zu erklären, geben aber keine konkreten Schritte an. Ich bin auf diesen Blog-Beitrag gestoßen, der ausführlich beschreibt, wie Token mit Node + Passport sicher erstellt und verwaltet werden.
http://aleksandrov.ws/2013/09/12/restful-api-with-nodejs-plus-mongodb/
quelle
Tipps zum Sichern von Webanwendungen
Wenn Sie Ihre Anwendung sichern möchten, sollten Sie auf jeden Fall HTTPS anstelle von HTTP verwenden . Dies stellt sicher, dass ein sicherer Kanal zwischen Ihnen und den Benutzern erstellt wird, der verhindert, dass die an die Benutzer gesendeten Daten abgehört werden, und dass die Daten erhalten bleiben vertraulich ausgetauscht.
Sie können JWTs (JSON Web Tokens) verwenden, um RESTful-APIs zu sichern . Dies hat im Vergleich zu serverseitigen Sitzungen viele Vorteile. Die Vorteile sind hauptsächlich:
1- Skalierbarer, da Ihre API-Server nicht für jeden Benutzer Sitzungen verwalten müssen (was bei vielen Sitzungen eine große Belastung sein kann).
2- JWTs sind in sich geschlossen und haben die Ansprüche, die zum Beispiel die Benutzerrolle definieren und auf die er zugreifen kann und die zum Datum und Ablaufdatum ausgestellt wurden (danach ist JWT nicht mehr gültig)
3- Einfachere Handhabung über Load-Balancer hinweg. Wenn Sie über mehrere API-Server verfügen, müssen Sie weder Sitzungsdaten freigeben noch den Server so konfigurieren, dass die Sitzung an denselben Server weitergeleitet wird, wenn eine Anforderung mit einem JWT einen Server trifft, kann diese authentifiziert werden & autorisiert
4- Weniger Druck auf Ihre Datenbank und Sie müssen nicht ständig Sitzungs-IDs und -Daten für jede Anforderung speichern und abrufen
5- Die JWTs können nicht manipuliert werden, wenn Sie einen starken Schlüssel zum Signieren der JWT verwenden. Sie können also den Ansprüchen in der JWT vertrauen, die mit der Anfrage gesendet werden, ohne die Benutzersitzung überprüfen zu müssen und ob er autorisiert ist oder nicht Sie können einfach die JWT überprüfen und dann wissen Sie, wer und was dieser Benutzer tun kann.
Node.js spezifische Bibliotheken zur Implementierung von JWTs:
Viele Bibliotheken bieten einfache Möglichkeiten zum Erstellen und Validieren von JWTs, zum Beispiel: In node.js ist jsonwebtoken eine der beliebtesten. Sie können auch zur Validierung der JWTs dieselbe Bibliothek verwenden oder express-jwt oder koa-jwt verwenden (falls vorhanden) mit Express / Koa)
Da REST-APIs im Allgemeinen darauf abzielen, den Server zustandslos zu halten, sind JWTs mit diesem Konzept besser kompatibel, da jede Anforderung mit einem eigenständigen Autorisierungstoken (JWT) gesendet wird, ohne dass der Server die Benutzersitzung im Vergleich zu Sitzungen, in denen der Server ausgeführt wird, verfolgen muss Server statusbehaftet, damit er sich an den Benutzer und seine Rolle erinnert. Sitzungen sind jedoch auch weit verbreitet und haben ihre Vorteile, nach denen Sie suchen können, wenn Sie möchten.
Eine wichtige Sache, die Sie beachten sollten, ist, dass Sie das JWT mithilfe von HTTPS sicher an den Client senden und an einem sicheren Ort speichern müssen (z. B. im lokalen Speicher).
Weitere Informationen zu JWTs finden Sie unter diesem Link
quelle