Why is PassportJS in Node not removing session on logout

前端 未结 22 1843
有刺的猬
有刺的猬 2020-11-28 22:11

I am having trouble getting my system to log out with PassportJS. It seems the logout route is being called, but its not removing the session. I want it to return 401, if th

22条回答
  •  死守一世寂寞
    2020-11-28 23:09

    I got an experience that, sometime it's doesn't work because you fail to to setup passport properly. For example, I do vhost, but on main app I setup passport like this which is wrong.

    app.js (why wrong ? please see blockqoute below)

    require('./modules/middleware.bodyparser')(app);
    require('./modules/middleware.passport')(app);
    require('./modules/middleware.session')(app);
    require('./modules/app.config.default.js')(app, express);
    
    // default router across domain
    app.use('/login', require('./controllers/loginController'));
    app.get('/logout', function (req, res) {
        req.logout();
        res.redirect('/');
    });
    
    // vhost setup
    app.use(vhost('sub1.somehost.dev', require('./app.host.sub1.js')));
    app.use(vhost('somehost.dev', require('./app.host.main.js')));
    

    actually, it must not be able to login, but I manage to do that because, I continue to do more mistake. by putting another passport setup here, so session form app.js available to app.host.sub1.js

    app.host.sub1.js

    // default app configuration
    require('./modules/middleware.passport')(app);
    require('./modules/app.config.default.js')(app, express);
    

    So, when I want to logout... it's not work because app.js was do something wrong by start initialize passport.js before express-session.js, which is wrong !!.

    However, this code can solved the issues anyway as others mention.

    app.js

    app.get('/logout', function (req, res) {
        req.logout();
        req.session.destroy(function (err) {
            if (err) {
                return next(err);
            }
    
            // destroy session data
            req.session = null;
    
            // redirect to homepage
            res.redirect('/');
        });
    });
    

    But in my case the correct way is... swap the express-session.js before passport.js

    document also mention

    Note that enabling session support is entirely optional, though it is recommended for most applications. If enabled, be sure to use express.session() before passport.session() to ensure that the login session is restored in the correct order.

    So, resolved logout issue on my case by..

    app.js

    require('./modules/middleware.bodyparser')(app);
    require('./modules/middleware.session')(app);
    require('./modules/middleware.passport')(app);
    require('./modules/app.config.default.js')(app, express);
    
    
    // default router across domain
    app.use('/login', require('./controllers/loginController'));
    app.get('/logout', function (req, res) {
        req.logout();
        res.redirect('/');
    });
    

    app.host.sub1.js

    // default app configuration
    require('./modules/app.config.default.js')(app, express);
    

    and now req.logout(); is work now.

提交回复
热议问题