Knoten js Authentifizierung in domänenübergreifender Domäne

8

Ich arbeite an einer MEAN Anwendung, ich verwende Angular 4 für mein Projekt. Zur Authentifizierung habe ich den Passport js Local-strategy implementiert. Und ich behalte anhaltende Sitzung mit Express-session . Die Dinge funktionieren gut bis hier.

Das Problem

In der gleichen Domäne funktioniert session gut und ich kann den Benutzer authentifizieren. Aber im domänenübergreifenden Bereich kann ich die Sitzung nicht verwalten. Es generiert eine neue Sitzungs-ID für jede neue Anfrage in domänenübergreifender Domäne.

Ich habe dann Passport-jwt ausprobiert, aber das Problem dabei ist, dass ich die Kontrolle über die Benutzersitzung nicht habe. Ich meine, ich kann den Benutzer nicht vom Server abmelden, wenn er inaktiv ist oder sogar beim Neustart des Servers auch die token nicht ungültig wird.

In einfachen Worten, ich suche nach einer Authentifizierungslösung in Knoten js (Express js), in der ich die Authentifizierung domänenübergreifend verwalten kann.

Ich habe bereits einige Blogpost- und SO-Fragen wie gesehen dies , aber es hilft nicht.

Danke.

BEARBEITEN

Soll ich meinen eigenen Code schreiben, um dies zu erreichen? Wenn ja, habe ich einen Plan.

Mein Grundplan ist:

  1. Der Benutzer sendet Anmeldeinformationen mit der Anmeldeanforderung.
  2. Ich werde nach den Zugangsdaten in der Datenbank suchen. Wenn die Berechtigungsnachweise gültig sind, erstelle ich ein zufälliges Token und speichere es in der Datenbank, in der Benutzertabelle und dem gleichen Token, das ich dem Benutzer mit einer Erfolgsantwort zur Verfügung stelle.
  3. Nun wird der Benutzer mit jeder Anfrage das Token senden und ich werde das Token für jede Anfrage in der Datenbank überprüfen. Wenn das Token gültig ist, erlaube ich dem Benutzer, auf die API zuzugreifen, andernfalls erzeuge ich einen Fehler mit dem Statuscode 401.
  4. Ich benutze Mongoose (MongoDB), also werde ich in Ordnung sein, um das Token in jeder Anfrage zu überprüfen (Performance-Sicht).

Ich denke, das ist auch eine gute Idee. Ich möchte nur ein paar Vorschläge, ob ich in die richtige Richtung denke oder nicht.

Was ich damit bekommen werde:

  1. Die Anzahl der angemeldeten Benutzer in der Anwendung (aktive Sitzungen).
  2. Ich kann einen Benutzer abmelden, wenn er sich für ein bestimmtes Zeitintervall im Leerlauf befindet.
  3. Ich kann mehrere Login-Sitzungen desselben Benutzers verwalten (indem ich einen Eintrag in der Datenbank mache).
  4. Ich kann dem Endbenutzer erlauben, alle anderen Anmeldesitzungen (wie Facebook und Gmail) zu löschen.
  5. Jede Anpassung im Zusammenhang mit der Autorisierung.

BEARBEITEN 2

Hier teile ich meinen app.js code

%Vor%

EDIT 3

  

Für diejenigen, die mein Problem nicht verstehen. Erklären Sie das Problem in   einfache Worte:

  1. Mein Express-Server läuft auf Port 3000.
  2. Um eine API vom Server zu verbrauchen, muss ein Benutzer angemeldet sein.
  3. Wenn ein Benutzer von localhost:3000 angemeldet wird, überprüft der Server die Anmeldeinformationen (unter Verwendung von Passport-local) und gibt ein Token im Antwortheader zurück.
  4. Jetzt, nachdem ein Benutzer eine API von localhost:3000 erreicht hat, kommt eine vordefinierte Header mit passport-session und der Pass überprüft die Benutzersitzung mit req.isAuthenticated() und alle Dinge funktionieren wie erwartet.
  5. Wenn ein Benutzer von localhost:4000 eingeloggt wird und der Server ein Token im Antwortheader sendet (wie localhost:3000 ).
  6. Wenn der Benutzer nach der erfolgreichen Anmeldung eine API von localhost:4000 antrifft, gibt die Pass-js-Funktion req.isAuthenticated() false .
  7. zurück
  8. Dies passierte, weil in der domänenübergreifenden Domäne cookie nicht auf den Server geht, müssen wir auf der Clientseite withCredentials header auf true setzen.
  9. Ich habe withCredentials header auf true gesetzt, aber immer noch auf dem Server gibt req.isAuthenticated() false zurück.
Arpit Meena 26.11.2017, 14:41
quelle

5 Antworten

1

Eine mögliche Lösung, um Probleme mit CORS / cookie / same-domain zu umgehen, ist die Erstellung eines Proxyservers, der alle Anfragen von localhost:3000/api nach localhost:4000 widerspiegelt und dann localhost:3000/api für den Zugriff auf die API anstelle von% co_de verwendet %.

Der beste Weg für die Produktionsbereitstellung ist, dies auf Ihrem Webserver (nginx / apache) zu tun.

Sie können dies auch im Knoten über localhost:4000 und express modules tun, oder verwenden Sie eine fertige Middleware wie diese:

Ссылка

Lösung mit dieser Middleware ist ziemlich einfach:

%Vor%     
Martin Adámek 09.12.2017 09:09
quelle
0

Wenn Sie Sitzungen (dh statt JWT usw.) verwenden möchten, denke ich, dass sie standardmäßig nur In-Memory sind, also wird es nicht funktionieren, da Ihre Anwendung auf mehrere Hosts skaliert. Es ist einfach, sie so zu konfigurieren, dass sie bestehen bleiben.

Siehe Ссылка

    
Adam Butler 05.12.2017 06:52
quelle
0

Sie haben es vielleicht mit dem Pass-jwt versucht. Es generiert Token gemäß dem JWT-Protokoll bei der Anmeldung. Ihre Anforderung besteht darin, das generierte Token bei der Abmeldung in die Blacklist aufzunehmen. Um dies zu erreichen, können Sie eine Sammlung in mongodb namens "BlacklistToken" mit den Feldern userid und token erstellen. Wenn sich der Benutzer abmeldet, können Sie das Token und die Benutzer-ID in die Sammlung einfügen. Schreiben Sie dann eine Middleware, um zu überprüfen, ob das Token auf der Blacklist ist oder nicht. wenn es auf die Anmeldeseite umgeleitet wird.

    
LENIN LAWRENCE 06.12.2017 05:55
quelle
0

Hast du schon hier nachgesehen:

  

In diesem Fall können Antworten basierend auf einigen Überlegungen zurückgesendet werden.

     

Wenn auf die fragliche Ressource weitgehend zugegriffen werden soll (genau wie jede HTTP-Ressource, auf die GET zugreift), reicht das Zurücksenden des Access-Control-Allow-Origin: * Headers aus , [...]

Sie können dies versuchen (erlauben Sie jede öffentliche IP):

%Vor%

Es ist normal, dass der zweite Server eine neue Sitzung neu erstellt, da Sie davon ausgehen, dass Sie Express-Sitzung verwenden, und entsprechend die Dokumentation :

  

Sitzungsdaten werden nicht im Cookie gespeichert , sondern nur die Sitzungs-ID. Sitzungsdaten werden serverseitig gespeichert .

Was bedeutet, dass Sie eine Möglichkeit finden müssen, um Server-Sitzungsdaten zu synchronisieren ... Angenommen, Sie finden eine Methode, um dies zu tun, wenn Sie versuchen, eine Verbindung herzustellen, werden beide Server die gleichen Benutzersitzungsdaten abrufen und der zweite muss keine neue Sitzung erstellen ...

    
A STEFANI 08.12.2017 12:29
quelle
0

Wenn ich das Problem hier richtig verstehe, möchten Sie, dass die Benutzersitzung auf dem Server statusfrei ist. Wenn der Benutzer sich anmeldet, kann die Sitzung in jeder Instanz des Servers wiederverwendet werden, wenn Sie Ihre Anwendung skalieren oder wenn Sie Ihre Anwendung gerade neu starten.

Um dies zu erreichen, müssen Sie express-session mit einer Datenbanklösung konfigurieren. Sie können dies mit mongo tun, indem Sie dieses Paket Ссылка verwenden.

Es empfiehlt sich jedoch, etwas robusteres für diesen Anwendungsfall zu verwenden, wie redis mit diesem Paket Ссылка .

    
asosnovsky 08.12.2017 14:59
quelle