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:
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:
BEARBEITEN 2
Hier teile ich meinen app.js
code
EDIT 3
Für diejenigen, die mein Problem nicht verstehen. Erklären Sie das Problem in einfache Worte:
localhost:3000
angemeldet wird, überprüft der Server die Anmeldeinformationen (unter Verwendung von Passport-local) und gibt ein Token im Antwortheader zurück. 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. localhost:4000
eingeloggt wird und der Server ein Token im Antwortheader sendet (wie localhost:3000
). localhost:4000
antrifft, gibt die Pass-js-Funktion req.isAuthenticated()
false
. cookie
nicht auf den Server geht, müssen wir auf der Clientseite withCredentials
header auf true
setzen. withCredentials
header auf true
gesetzt, aber immer noch auf dem Server gibt req.isAuthenticated()
false
zurück. 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%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 Ссылка
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.
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 ...
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 Ссылка .
Tags und Links javascript authentication node.js express mean-stack