سؤال

I have implemented Passport with passport-local and MongoDB and it is working nicely.

However this is a pure client-side single-loading app and so node is not responsible for the rendering of html. So currently I show a loading a spinner on app load and make a separate call to an api to determine if the user is logged in to conditionally render some stuff:

router.get('/me', function (req, res) {
    res.send(req.isAuthenticated() ? {} || 401);
});

Since passport already authenticates my routes and calls deserializeUser this seems pointless - I need a way to pass an extra piece of info (in the cookie?) stating that the user is authed, I am guessing in deserializeUser?

server.use(session({secret: settings.sessionSecret}));
server.use(passport.initialize());
server.use(passport.session());

....

passport.use(new LocalStrategy(
        localOpts,
        function(email, password, done) {
            User.findOne({
                email: email,
                activated: true
            }, function (err, user) {
                ....
        });
    }
));

passport.serializeUser(function (user, done) {
    done(null, user._id);
});

passport.deserializeUser(function (id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

Note that the two cookies that get created when sign in is successful:

express:sess
express:sess.sig

When it detects the presence of these cookies it seems to just call deserializeUser hence why I think I could possibly communicate to the client the user is authed there, or otherwise on sign in inside passport.use middleware?

هل كانت مفيدة؟

المحلول

It turns out that I can simply add a middleware after the passport.session. I was concerned that req.isAuthenticated would fire off another query to the db but it doesn't:

server.use(function(req, res, next) {
    res.cookie('isAuthenticated', req.isAuthenticated());
    next();
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top