Alexander Mills
Alexander Mills

Reputation: 99960

Passport.js - req.session.passport.user is not showing up

I am using Passport.js with Express - for some reason the req.session.passport.user value is not present, when it should be, as you can see:

enter image description here

here is my passport configuration:

   passport.serializeUser(function (user, done) {
        console.log(colors.bgRed('serialize user called, user:', user));
        done(null, user._id);
    });

    passport.deserializeUser(function (id, done) {
        console.log(colors.bgRed('deserialize user called, user_id:', id));
        UserModel.getNewUser().findById(id, function (err, user) {
            console.log(colors.bgRed('deserialize find user called, user:', user));
            done(err, user);
        });
    });

    passport.use('local', new LocalStrategy(function (username, password, done) {
        UserModel.getNewUser().findOne({
            username: username
        }, function (err, user) {
            if (err) {
                return done(err);
            }
            if (!user) {
                return done(null, false, {
                    message: 'Incorrect username.'
                });
            }
            if (!user.validPassword(password)) {
                return done(null, false, {
                    message: 'Incorrect password.'
                });
            }
            // req.user = user;
            return done(null, user);
        });
    }));

does anyone know what could be going wrong? My only guess is that I might need to deserialize using the Session object, instead of the user id, but that I believe is incorrect. I do know for a fact that deserializeUser and serializeUser are not being called at all.

Upvotes: 1

Views: 1421

Answers (1)

Alexander Mills
Alexander Mills

Reputation: 99960

It was hard to find an answer for this online, so I think one should go here.

The problem was because instead of using this:

    app.post('/login', passport.authenticate('local', { successRedirect: '/',
 failureRedirect: '/login' }));

...I decided to use this style of call with Passport:

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

Originally my code was like so:

passport.authenticate('local', function (err, user, info) {
        if (err) {
            return next(err);
        }
        if (!user) {

            registerUser(req,res,next);
        }
        else{

                res.locals.loggedInUser = user._doc;
                res.json({alreadyRegistered: !justRegistered,msg:user._doc});

        }

    })(req, res, next);

but then I updated it with req.logIn like so:

passport.authenticate('local', function (err, user, info) {
        if (err) {
            return next(err);
        }
        if (!user) {

            console.log('no account found, so we will register user as expected...');
            registerUser(req,res,next);
        }
        else{

            req.logIn(user, function (err) {   //this is crucial

                if(err){
                    return next(err);
                }

                res.locals.loggedInUser = user._doc;
                res.json({alreadyRegistered: !justRegistered,msg:user._doc});
            });
        }

    })(req, res, next);

and now it works - should have followed the docs better. I recommend that Jared Hansson puts in "this is crucial" in the docs where I have just labeled it above. Otherwise, yes I should have followed the docs more closely.

Upvotes: 4

Related Questions