Sichern der REST-API meiner Node.js-App?

Lesezeit: 10 Minuten

Benutzer-Avatar
littlejim84

Ich könnte etwas Hilfe bei meiner REST-API gebrauchen. Ich schreibe eine Node.js-App, die Express, MongoDB verwendet und Backbone.js auf der Clientseite hat. Ich habe die letzten zwei Tage damit verbracht, all dies herauszufinden, und hatte nicht viel Glück. Ich habe schon nachgeschaut:

Ich möchte mein Backend und Frontend so getrennt wie möglich halten, also dachte ich, es wäre gut, eine sorgfältig entworfene REST-API zu verwenden. Ich denke, wenn ich jemals dazu komme, eine iPhone-App (oder etwas Ähnliches) zu entwickeln, 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 externe Anmeldung (Facebook/Twitter/etc) vermeiden. Ich möchte, dass die Registrierung und Anmeldung auf meiner App/Server erfolgt.

…aber ich bin hier immer noch verwirrt. Vielleicht ist es spät in der Nacht oder mein Gehirn ist gerade gebraten, aber ich könnte wirklich ein paar Schritte gebrauchen, was ich hier tun soll. Was sind die Schritte für mich, um eine sichere API zu erstellen?

Jede Hilfe, jede Information, alle Beispiele, Schritte oder irgendetwas wäre großartig. Bitte helfen Sie!

  • Was hast du am Ende gemacht?

    – Morteza Shahriari Nia

    14. Dezember 2014 um 18:42 Uhr

Benutzer-Avatar
Ghickmann

In der Reihenfolge zunehmender Sicherheit / Komplexität:

Einfache HTTP-Authentifizierung

In vielen API-Bibliotheken können Sie dies einbauen (Piston in Django zum Beispiel) oder Sie können es Ihrem Webserver überlassen. Sowohl Nginx als auch Apache können Serveranweisungen verwenden, um eine Site mit einem einfachen b64-codierten Passwort zu sichern. Es ist nicht die sicherste Sache der Welt, aber es ist zumindest ein Benutzername und ein Passwort!

Wenn Sie Nginx verwenden, können Sie Ihrer Hostkonfiguration einen Abschnitt wie folgt hinzufügen:

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

(Legen Sie es in Ihre location / Block)

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

Sie müssen das Python-Skript abrufen, um dieses Passwort zu generieren und die Ausgabe in eine Datei zu schreiben: 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 einfachste und verhindert Man-in-the-Middle-Angriffe.

Sie können dies mit Nginx tun, die Dokumentation dafür ist 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, bieten Ihnen jedoch den Vorteil, den Zugriff zu widerrufen, falls dies erforderlich sein sollte. 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 hier das Richtige. Obwohl ich die zugrunde liegende Funktionsweise der Spezifikation nicht kenne, ist sie jetzt der Defacto-Standard für die meisten Authentifizierungen (Twitter, Facebook, Google usw.) und es gibt eine Menge Bibliotheken und Dokumente, die Ihnen bei der Implementierung dieser helfen. Abgesehen davon wird es normalerweise verwendet, um einen Benutzer zu authentifizieren, indem ein Drittanbieterdienst um die Authentifizierung gebeten 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 platzieren und sie über HTTPS bereitzustellen, insbesondere wenn Sie keine Zeit damit verschwenden möchten, mit OAuth herumzuspielen.

  • Gute Antwort. Ich sehe, dass OAuth der Standard zu sein scheint. Aber es scheint 2-beiniges OAuth 1.0, 3-beiniges OAuth 1 und dann dieses OAuth 2 zu geben … Also sollte ich mich mit OAuth 2 befassen? …Ich dachte an HTTPS/SSL, aber ich bin mir nicht sicher, wie so etwas wie eine iPhone-App darüber übertragen könnte (ist das überhaupt möglich)? … eine weitere Frage zu OAuth, kann ich sowohl Anbieter als auch Verbraucher sein, oder muss ich – wie Sie sagen – einen Drittanbieter zur Authentifizierung verwenden? In dieser Situation wäre die Verwendung eines Drittanbieters nicht zu vorzuziehen, es ist nicht wirklich diese Art von App. Danke für die ausführliche Antwort!

    – littlejim84

    3. Februar 2012 um 7:24 Uhr

  • OAuth 2 ist das aktualisierte OAuth. Ich glaube, 1.0 wird jetzt als “schlecht” angesehen. Das iPhone funktioniert definitiv über HTTPS (Github in Mobile Safari!).

    – Ghickmann

    3. Februar 2012 um 8:20 Uhr

  • Du kann beides sein, aber normalerweise wird OAuth verwendet, um sich über einen Drittanbieter zu authentifizieren. Wie @mjtamlyn unten betonte, ist die Verwendung Ihres aktuellen Authentifizierungssystems sicherlich eine Möglichkeit. Ich habe meine Antwort mit einigen Schritten für einige der Teile aktualisiert.

    – Ghickmann

    3. Februar 2012 um 9:26 Uhr

  • Danke für die Antwort! Das hat mir viele Informationen gegeben, die ich verarbeiten muss, da all diese Authentifizierungssachen sehr neu für mich sind 🙂

    – littlejim84

    3. Februar 2012 um 9:49 Uhr

  • Ich bin gerade auf diesen Artikel gestoßen, der OAuth1 und OAuth2 kurz erklärt stormpath.com/blog/secure-your-rest-api-right-way

    – Fabian

    24. Juli 2014 um 20:49 Uhr

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 an, gibt einige Anmeldeinformationen an, und Sie geben dem Benutzer ein Cookie oder einen ähnlichen Token, mit dem Sie identifizieren, dass sich der Benutzer angemeldet hat. Der Benutzer fordert dann eine Seite an, die eingeschränkte Informationen enthält (oder erstellt / Ändern/Löschen), also überprüfen Sie dieses Token, um sicherzustellen, dass der Benutzer diese Informationen anzeigen darf.

Nun, für mich klingt es so, als würden Sie hier nur die Art und Weise ändern, wie Informationen übermittelt 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 tragen dasselbe eingeloggte Token wie zuvor, daher schlage ich vor, dieses Token einfach zu überprüfen und die Informationen auf die gleiche Weise auf „nur das, was der Benutzer wissen darf“ zu beschränken.

Ihre API ist jetzt so sicher wie Ihre Anmeldung – wenn jemand das für den Zugriff auf die API erforderliche Token kennen würde, wäre er auch auf der Website angemeldet und hätte sowieso Zugriff auf alle Informationen. Das Beste daran ist, wenn Sie die Anmeldung bereits implementiert haben, müssen Sie nicht wirklich mehr tun.

Der Sinn von Systemen wie OAuth besteht darin, 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 liegt in der Zukunft. Es ist nichts Falsches daran, dass die API mehr als eine Authentifizierungsmethode akzeptiert!

  • Also überdenke ich es nur, nehme ich an? Ich habe bereits eine “normale” Authentifizierung im Gange … Der Benutzer meldet sich an, ein Cookie wird für die Sitzung erstellt und die Website prüft, ob der Benutzer für die verschiedenen “sicheren” Teile angemeldet ist. Also im Grunde ist es das!? … Ich denke nur über das Problem nach und versuche, mit OAuth usw. umzugehen, aber in Wirklichkeit ist es immer noch nur das grundlegende Authentifizierungszeug … Nun, wenn es das ist, dann ist das in Ordnung! Ich nehme an, wenn überhaupt, muss ich SSL auf meinem Server sortieren lassen, aber abgesehen davon kann ich einfach mein normales Authentifizierungsverfahren verwenden?

    – littlejim84

    3. Februar 2012 um 9:49 Uhr

  • Es könnte sein, dass mir hier etwas fehlt, aber verstößt das nicht gegen die Kapitalregel von APIs? Dh: kein serverseitiger Zustand? Wenn der Server Token nachverfolgen muss, bedeutet dies, den Status zu halten, was ein bisschen tabu sein sollte 🙂

    – Dieter

    6. Mai 2012 um 9:59 Uhr

  • @Dieter es ist zustandslos, da der Zustand nicht im http übergeben wird

    – Tippfehler Johnson

    18. April 2013 um 16:04 Uhr

  • @dieter Die Token können so konstruiert werden, dass die Server keine Datenbank mit ausgestellten Token pflegen müssen, um ein Token zu validieren. Signieren Sie das Token mit einem privaten Schlüssel, damit jeder mit dem passenden öffentlichen Schlüssel überprüfen kann, ob a) das Token von einem vertrauenswürdigen Server ausgestellt wurde (Authentizität) und b) das Token nicht geändert wurde (Genauigkeit). Das Token sind die Zustandsdaten, sodass der Server zustandslos sein kann. OAuth2 definiert nicht den Inhalt eines Tokens, sondern nur, wie man einen erhält. JSON Web Tokens (JWT) definieren ein sicheres Tokenformat, das mit OAuth2 verwendet werden kann.

    – dthorpe

    1. Mai 2014 um 5:34 Uhr

  • @dthorpe Danke! Das macht Sinn. TypoJohnson, fürs Protokoll, ich bin mir ziemlich sicher, dass dies nicht das ist, was zustandslos in APIs bedeutet. Stateless = die API kann jede Anfrage verarbeiten, ohne sich etwas merken zu müssen. Es spielt also keine Rolle, ob Server 2 einen Client bedient, der vor einer Minute von Server 1 bedient wurde. In einigen Fällen ist es also ganz in Ordnung, wenn der Zustand im http (vom Client) übergeben wird. Und wenn dies nicht möglich ist, müssen sie nur eine DB oder einen Cache zwischen allen API-Servern teilen

    – Dieter

    7. Mai 2014 um 14:02 Uhr


Die bisherigen Antworten erklären sehr gut, geben jedoch keine tatsächlichen Schritte an. Ich bin auf diesen Blog-Beitrag gestoßen, der sehr detailliert darauf eingeht, wie man Token sicher mit Node + Passport erstellt und verwaltet.

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

Benutzer-Avatar
Ahmed Elkoussy

Tipps gültig für die Sicherung jeder Webanwendung

Wenn Sie Ihre Bewerbung sichern möchten, dann sollten Sie auf jeden Fall mit HTTPS statt HTTP beginnenstellt dies sicher, dass zwischen Ihnen und den Benutzern ein sicherer Kanal entsteht, der das Ausspionieren der an die Benutzer gesendeten Daten verhindert und dazu beiträgt, die ausgetauschten Daten vertraulich zu halten.

Sie können JWTs (JSON Web Tokens) verwenden, um RESTful-APIs zu sichernhat dies im Vergleich zu serverseitigen Sitzungen viele Vorteile. Die Vorteile sind hauptsächlich:

1- Mehr Skalierbarkeit, da Ihre API-Server keine Sitzungen für jeden Benutzer aufrechterhalten müssen (was bei vielen Sitzungen eine große Belastung sein kann)

2- JWTs sind eigenständig und haben die Ansprüche, die beispielsweise die Benutzerrolle definieren und auf was er zugreifen kann und ausgestellt am Datum und Ablaufdatum (nach dem JWT nicht mehr gültig ist).

3- Einfachere Handhabung über Load-Balancer hinweg und wenn Sie mehrere API-Server haben, da Sie weder Sitzungsdaten teilen noch den Server konfigurieren müssen, um die Sitzung an denselben Server weiterzuleiten, wenn eine Anfrage mit einem JWT einen Server trifft, kann sie authentifiziert werden & autorisiert

4- Weniger Druck auf Ihre DB und Sie müssen nicht ständig Sitzungs-IDs und Daten für jede Anfrage speichern und abrufen

5- Die JWTs können nicht manipuliert werden, wenn Sie einen starken Schlüssel zum Signieren des JWT verwenden, sodass Sie den Ansprüchen im JWT vertrauen können, das mit der Anfrage gesendet wird, ohne die Benutzersitzung überprüfen zu müssen und ob er autorisiert ist oder nicht , können Sie einfach das JWT überprüfen und wissen dann, 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 eine der beliebtesten jsonwebtokenauch für die Validierung der JWTs können Sie dieselbe Bibliothek verwenden oder verwenden express-jwt oder koa-jwt (wenn Sie express/koa verwenden)

Da REST-APIs im Allgemeinen darauf abzielen, den Server zustandslos zu halten, sind JWTs besser mit diesem Konzept kompatibel, da jede Anforderung mit einem eigenständigen Autorisierungstoken gesendet wird (JWT) ohne dass der Server die Benutzersitzung verfolgen muss, im Vergleich zu Sitzungen, die den Server zustandsbehaftet machen, sodass 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.

Beachten Sie unbedingt, dass Sie das JWT sicher über HTTPS 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

1054110cookie-checkSichern der REST-API meiner Node.js-App?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy