req.session.passport und req.user leer, und req.isAuthenticated gibt nach der ersten erfolgreichen Anmeldung mit pass-facebook false zurück

8

Nach dem ersten erfolgreichen Login von Facebook und Login Redirection Callback mit Pass-facebook 1.0.3 und Express 4.6.1, req.session.passport und req.user enthält den Wert während der Serialisierung (die ich von der Strategie), aber bei nachfolgenden Besuchen auf verschiedenen Routen auf der Website sind req.session.passport und req.user leer, und req.isAuthenticated () gibt false zurück, also nach der ersten erfolgreichen Anmeldung vom FB die Methode securityAuthentication auf allen anderen Routen schlägt fehl. Ich verwende kein Cluster-Setup, also glaube ich, dass der Speicher ausreichend ist, um damit umzugehen, die Express-Konfiguration sieht gut aus (ich meine die Reihenfolge), hier ist meine Express-Konfiguration

%Vor%

Hier ist das req.session-Objekt für die anfängliche erfolgreiche Anmeldung und Umleitung. Der req.user enthält die gleichen Daten wie req.session.passport.user

%Vor%

Dies sind die Informationen, die ich zuvor mit dem Rückruf done () innerhalb der Strategie und auch innerhalb des Serialisierungsaufrufs verknüpft habe. Nach der erfolgreichen Anmeldung und dem Rückruf verwende ich res.redirect, um den Benutzer auf eine andere Route umzuleiten, aber die Anfragen, die von dieser Route kommen, enthalten die SessionID (also denke ich nicht, dass es das Problem mit dem Sitzungsspeicher ist), sondern der req.user field doesnt exist (kann sein, da pass.initialize () und pass.session () middlewares die Anfrage nicht finden um authentifiziert zu werden) und das req.session.passport Feld ist leer, hier sind die Details aus der console.log der req Objekt .

%Vor%

Hier ist meine Deserialisierungsmethode

%Vor%

Hier ist meine Serialisierungsmethode

%Vor%

Dies ist ein großes Hindernis für meine Entwicklung, wie kann ich das aussortieren?

    
Karthic Rao 22.07.2014, 13:50
quelle

1 Antwort

9

Nun, wenn Sie den Code hinzufügen könnten, in dem Sie Ihre Strategie verwenden (sie sollte in der Middleware enthalten sein), würden wir uns eine vollständige Sicht auf das Problem verschaffen, weil wir wissen müssen, welches Objekt an serializeUser gesendet wird.

(Sehr) Grundsätzlich passiert es, wenn ein Benutzer versucht, sich zu authentifizieren:

  • Passport versucht, Ihren Benutzer gegen Facebook-Server
  • zu authentifizieren
  • Wenn es erfolgreich ist, wird die Callback-Funktion (oder successRedirect) aufgerufen mit einem Objekt, das die Benutzerdetails enthält
  • Dann ruft Passport req.login an, um Informationen darüber zu speichern der Benutzer in der Sitzung
  • Dann wird serializeUser aufgerufen und speichert die Daten effektiv Sie in Sitzung angegeben.

ABER von dem Code, den Sie gepostet haben, vermute ich, dass in Ihrer deserializeUser , user.id undefiniert ist, weil das Objekt user , das in der Sitzung gespeichert ist, ein ID-Feld mit dem Namen _id und nicht id .

Wenn Sie

ändern %Vor%

bis

%Vor%

%Vor%

Ich denke, es sollte funktionieren.

BEARBEITEN : Ich habe meine Antwort basierend auf @ BrandonZacharies Bemerkung bearbeitet, die auf einen Fehler in meinem Code hinwies.

    
Waldo Jeffers 29.07.2014, 08:05
quelle