Wpis z mikrobloga

#nodejs #programowanie

Cześć,
Mam problem z przekazaniem obiektu do widoku. Do aplikacji można zalogować się „tradycyjnie” lub poprzez facebooka. Na następnej stronie ma ukazać się informacja ‘witaj xyz’ jesteś zalogowany. Pojawia się problem logując się za pomocą facebooka, ponieważ pomimo zapisania do sesji obiektu przy próbie jego przekazania do widoku pojawia się informacja req.user undefined. Taką samą informację miałem gdy logowałem się „tradycyjnie”. Okazało się jednak, że pomogła zmiana kolejności inicjalizacji modułów Express session oraz passport. Brakuje już mi pomysłów. Zamieszczam kod może ktoś znów zauważy złą kolejność czy jakiś błąd. Zastanawiam się jeszcze czy nie można tego inaczej rozwiązać np. zapisać so sesji req.session.user = user w momencie serializacji jednakże nie mamy tam req.
Kod:
serwer
route

dependencies:
"bcryptjs": "^2.3.0",
"body-parser": "~1.15.1",
"connect-ensure-login": "^0.1.1",
"connect-flash": "latest",
"cookie-parser": "~1.4.3",
"debug": "~2.2.0",
"express": "~4.13.4",
"express-session": "latest",
"express-validator": "latest",
"hbs": "~4.0.0",
"mongodb": "latest",
"mongoose": "latest",
"morgan": "~1.7.0",
"passport": "latest",
"passport-facebook": "latest",
"passport-local": "^1.0.0",
"serve-favicon": "~2.3.0"
  • 7
@SebixBezKaryny: Ok pare kwestii:

route:130

return done(null, user); // user found, return that user
czy tutaj ten done() jest wykonywany? możesz sprawdzić jakimś console.logiem czy na pewno w momencie logowania ten kod jest wykonywany??

Druga sprawa czy serializeUser() jest wykonywane w momencie wykonania rządania po zalogowaniu się?

Kurcze.. ja akurat robiłem autoryzację przez Twitch.TV, ale miałem identyczny problem. Tylko najgorsze jest to że nie pamiętam dokładnie jak go rozwiązałem, ale wiem
@larvaexotech: o dzięki za kod i wskazówki.
Co do route 130 tak jest wykonywany.
Co do serializeUser tak jest wykonywany w momencie rządania po zalogowaniu.
Wszystko działa do momentu router.get(/lobby) wtedy nagle okazuje się, że req.user is undefined. Potwierdza to fakt, że gdy w serializeUser dodam obiekt user do listy obiektów a w router.get(/lobby) go sciągam i przekazuje do widoku to dostaje upragnione witaj xyz.
@SebixBezKaryny: no to nie wiem, ja bym po prostu wszedł w nodemodules i powrzucał console.logi do pakietu passport-facebook, w szczególności w momenty pomiędzy serializeUser() a rzeczywistym wykonywaniem requesta. możesz też sconsole.log'ować wszystko co się odbywa w kodzie middleware passport-facebook (zwracanym przez:
passport.authenticate('facebook', {scope: 'email'})
).

A w przypadku wykonywania serializeUser jesteś pewien że przekazujesz tam usera a nie null, undefined itp?

Zanurkuj w node
modules/passport/strategies/session.js, tam jest w pewnym momencie
@larvaexotech: faktycznie w warunku !user logując się przez fb dostaję info, że tam wszedł natomiast logując się normalnie on tam nie wchodzi. Deserialize zwraca null'a w przypadku logowania przez fb.
Chyba wiem dlaczego. W życiu bym na to nie wpadł. Mam serializację i deserializację zrobioną tylko dla jednejj kolekcji a używam dwóch. Nie znajdzie więc on id użytkownika z fb w tabeli dla zwykłego usera który rejestrował się poprzez stronę. Ale