wake-up-neo.net

Sicherung meiner Node.js-App REST API?

Ich könnte etwas Hilfe für meine REST - API gebrauchen. Ich schreibe eine Node.js-App, die Express, MongoDB und Backbone.js auf der Clientseite verwendet. Ich habe die letzten zwei Tage damit verbracht, alles zu klären und nicht viel Glück zu haben. Ich habe schon ausgecheckt:

Ich möchte mein Backend und mein Frontend so getrennt wie möglich halten, deshalb dachte ich darüber nach, eine sorgfältig entworfene REST - API zu verwenden, wäre gut. Ich denke, wenn ich jemals eine iPhone-App (oder etwas Ähnliches) entwickeln könnte, könnte sie mit der API auf Daten zugreifen.

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 externer Anmeldungen (Facebook/Twitter/etc) vermeiden.

... aber ich bin immer noch verwirrt hier. Vielleicht ist es spät in der Nacht oder mein Gehirn ist nur gebraten, aber ich könnte wirklich einige Schritte unternehmen, um zu sehen, was ich hier tun soll. Wie gehe ich vor, um eine sichere API zu erstellen?

Jede Hilfe, Informationen, Beispiele, Schritte oder ähnliches wäre großartig. Bitte helfen

67
littlejim84

Hier ist eine andere Art, darüber nachzudenken:

Nehmen wir einmal an, Sie verwenden keine API. Ihr Benutzer meldet sich mit einigen Anmeldeinformationen bei der App an, und Sie geben dem Benutzer ein Cookie oder ein ähnliches Token, das Sie zur Identifizierung des angemeldeten Benutzers verwenden. Der Benutzer fordert dann eine Seite an, die eingeschränkte Informationen enthält (oder ändern/löschen), so dass Sie dieses Token überprüfen, um sicherzustellen, dass der Benutzer diese Informationen anzeigen darf.

Nun, es scheint mir, dass das einzige, was Sie hier ändern, die Art und Weise ist, in der Informationen bereitgestellt werden. Anstatt die Informationen als gerenderten HTML-Code zu liefern, geben Sie die Informationen als JSON zurück und rendern sie auf der Clientseite. Ihre AJAX -Anfragen an den Server tragen das gleiche angemeldete Token wie zuvor, daher empfehle ich, dieses Token einfach zu überprüfen und die Informationen auf "genau das, was der Benutzer wissen darf" auf dieselbe Weise einzuschränken.

Ihre API ist jetzt so sicher wie Ihr Login. Wenn jemand das für den Zugriff auf das API erforderliche Token kennen sollte, wird er auch auf der Website angemeldet und hat ohnehin Zugriff auf alle Informationen. Das Beste ist, wenn Sie bereits ein Login implementiert haben, mussten Sie nicht wirklich mehr arbeiten.

Bei Systemen wie OAuth geht es darum, diese Anmeldemethode bereitzustellen, in der Regel 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 falsch mit der API, die mehr als eine Authentifizierungsmethode akzeptiert!

28
mjtamlyn

Um die Sicherheit/Komplexität zu erhöhen:

Basic HTTP Auth

In vielen API-Bibliotheken können Sie dies einbauen (z. B. Piston in Django) oder Sie können es Ihrem Webserver überlassen. Sowohl Nginx als auch Apache können Serveranweisungen verwenden, um eine Site mit einem einfachen b64encoded-Kennwort zu schützen. 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 wie folgt einen Abschnitt hinzufügen:

auth_basic "Restricted";
auth_basic_user_file /path/to/htpasswd;

(Fügen Sie es in Ihren location /-Block ein)

Dokumente: http://wiki.nginx.org/HttpAuthBasicModule

Sie benötigen das Python-Skript, um dieses Kennwort zu generieren, und legen Sie die Ausgabe in einer Datei ab: http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py?format=txt

Der Ort der Datei spielt keine Rolle, solange Nginx darauf zugreifen kann.

HTTPS

Sichern Sie die Verbindung von Ihrem Server zur App. Dies ist die grundlegendste Methode, die Angriffe verhindern kann.

Sie können dies mit Nginx tun, die Dokumente dafür sind sehr umfangreich: http://wiki.nginx.org/HttpSslModule

Ein selbstsigniertes Zertifikat dafür wäre in Ordnung (und kostenlos!).

API-Schlüssel

Diese können in jedem beliebigen Format vorliegen, aber Sie haben den Vorteil, den Zugriff zu sperren, falls Sie dies benötigen. Möglicherweise nicht die perfekte Lösung für Sie, wenn Sie beide Enden der Verbindung entwickeln. Sie werden normalerweise verwendet, wenn Dritte die API verwenden, z. B. Github.

OAuth

OAuth 2.0 ist hier das Richtige. Obwohl ich die zugrunde liegenden Funktionen der Spezifikation nicht kenne, ist dies jetzt der defacto-Standard für die meisten Authentifizierungen (Twitter, Facebook, Google usw.), und es gibt eine Unmenge von Bibliotheken und Dokumenten, die Ihnen helfen, diese zu implementieren. Allerdings wird es normalerweise verwendet, um einen Benutzer zu authentifizieren, indem er einen Drittanbieter-Dienst zur Authentifizierung auffordert.

Wenn Sie die Entwicklung für beide Zwecke durchführen, reicht es wahrscheinlich aus, Ihre API hinter Basic HTTP Auth zu stellen und sie über HTTPS bereitzustellen, vor allem, wenn Sie keine Zeit mit OAuth verschwenden möchten.

39
ghickman

Die bisherigen Antworten erklären zwar sehr gut, geben jedoch keine konkreten Schritte an. Ich bin auf diesen Blogbeitrag gestoßen, der sehr detailliert auf die sichere Erstellung und Verwaltung von Tokens mit Node + Passport eingeht.

http://aleksandrov.ws/2013/09/12/restful-api-with-nodejs-plus-mongodb/

8
andyzinsser

Tipps zum Sichern von Webanwendungen

Wenn Sie Ihre Anwendung sichern möchten, dann sollten Sie auf jeden Fall HTTPS anstelle von HTTP verwenden, dies gewährleistet eine Durch die Einrichtung eines sicheren Kanals zwischen Ihnen und den Benutzern wird verhindert, dass die an die Benutzer gesendeten Daten abgehört werden, und die ausgetauschten Daten werden vertraulich behandelt.

Sie können JWTs (JSON-Web-Tokens) zum Sichern von RESTful-APIs verwenden . 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 eine große Belastung sein kann, wenn Sie viele Sitzungen haben)

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 beliebigen Server trifft, der authentifiziert werden kann & autorisiert

4- Verringern Sie den Druck auf Ihre Datenbank, und Sie müssen Sitzungs-IDs und -Daten nicht ständig 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 Anforderung gesendet werden, ohne die Benutzersitzung überprüfen zu müssen und ob er autorisiert ist oder nicht Sie können nur das JWT überprüfen und dann wissen Sie, wer und was dieser Benutzer tun kann.

Node.js spezifische Bibliotheken zum Implementieren 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 dieselbe Bibliothek auch zum Validieren von JWTs verwenden oder Express-JWT oder Koa-JWT (wenn Sie Express/Koa verwenden)

Da REST APIs im Allgemeinen darauf abzielen, den Server statusfrei zu halten, sind JWTs mit diesem Konzept besser kompatibel, da jede Anforderung mit einem in sich geschlossenen Autorisierungstoken gesendet wird ( JWT) ohne dass der Server die Benutzersitzung im Vergleich zu Sitzungen verfolgen muss, die den Server in einen statusbehafteten Zustand versetzen, damit er sich an den Benutzer und seine Rolle erinnert. Sitzungen sind jedoch ebenfalls weit verbreitet und haben ihre Vorzüge , nach denen Sie suchen können, wenn Sie möchten.

Eine wichtige Sache, die Sie beachten müssen, ist, dass Sie das JWT mit HTTPS sicher an den Client übermitteln und an einem sicheren Ort (z. B. im lokalen Speicher) speichern müssen.

Sie können mehr über JWTs erfahren von diesem Link

0
Ahmed Elkoussy