简体   繁体   中英

passport.js session lost after redirect

I am trying to integrate passport into my node.js app.

app.js file

const app = express();
app.set('view engine', 'pug');
app.use('/libs', express.static('node_modules'));

require('../config/auth.config')(app, data, passport);
app.use((req, res, next) => {
    res.locals.user = req.user;
    next();
});

app.get('/', (req, res) => {
        // those objects are populated correctly after redirect from auth middleware
        console.log(req.session)
        console.log(req.user)
        return res.render('home');
    });
app.get('/login', console.log(req.user);
        // req.user is undefined here
        if (req.user) {
            return res.redirect('/');
        }

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

auth.config.js

const express = require('express');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const LocalStrategy = require('passport-local');
const MongoStore = require('connect-mongo')(session);
const config = require('./config');

const configAuth = (app, {
    users
}, passport, db) => {
    app.use(cookieParser('Purple Unicorn'));
    app.use(bodyParser.urlencoded({
        extended: true,
    }));
    app.use(bodyParser.json());
    app.use(session({
        store: new MongoStore({
            url: config.connectionString
        }),
        secret: 'Purple Unicorn',
        resave: true,
        saveUninitialized: true,
    }));
    app.use(passport.initialize());
    app.use(passport.session());

    passport.use(new LocalStrategy((username, password, done) => {
        return users.login(username, password)
            .then((user) => {
                if (user) {
                    return done(null, user);
                }
                return done(null, false);
            });
    }));

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

    passport.deserializeUser((id, done) => {
        users.getUserById(id)
            .then((user) => {
                console.log(user);
                if (user) {
                    done(null, user);
                }

                done(null, false);
            });
    });

    app.use((req, res, next) => {
        res.locals = {
            user: req.user,
        };
        next();
    });
};

module.exports = configAuth;

The data object is working correctly.

After the post request on /login with correct data, I am redirected to / where console.log(req.user) prints the correct user. It is also added in the req.session object.

After I follow a link to /login , it should redirect me after the check for req.user but returns undefined . Sessions in mongo are stored correctly.

It seems passport is not saving the session correctly.

The problem is in your deserializeUser method where you always run done callback twice. In if statement you should use return done(null, user); to get out from function;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM