Завершенные сеансы не уничтожаются

Мое приложение использует connect-mongo, express-session, keystone и passport для обработки входов в систему и пользовательских сессий.

Однако, когда сеанс заканчивается (пользователь выходит из системы или закрывает окно браузера), сеанс не удаляется из хранилища сеансов MongoDB.

Вот моя установка промежуточного программного обеспечения:

var express = require('express')
    , path = require('path')
    , cookieParser = require('cookie-parser')
    , bodyParser = require('body-parser')
    , passport = require('passport')
    , session = require('express-session')
    , mongoStore = require('connect-mongo')(session)
    , compression = require('compression')
    , favicon = require('serve-favicon')
    , config = require('../config')
    , flash = require('connect-flash');

app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', parameterLimit: 52428800, extended: true}));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(compression());
app.use(express.static(path.join(__dirname, '../', config.get('staticContentPath')), {
    maxAge: (60 * 60 * 24 * 7) * 1000 
}));

app.use(session({
    secret: process.env.COOKIE_SECRET,
    resave: false,
    saveUninitialized: true,
    cookie: {
        maxAge: 24 * 60 * 60 * 1000 // 24 hrs
    },
    store: new mongoStore({
        url: config.get('mongo')
    })
}));

app.use(passport.initialize());
app.use(passport.session());

Имя коллекции для сессий в MongoDB - app_sessions. Поиск в моем дереве зависимостей показывает, что это обрабатывается CMS Keystone.

Также имя файла cookie - keystone.sid.

Это мой конфиг Keystone:

var config = require('../../lib/config')
    , keystone = require('keystone');

module.exports = function(app){

    keystone.init({
        'app': app,
        'port': config.get('keystone').port,
        'brand': config.get('sitename'),
        'views': app.get('views'),
        'view engine': app.get('view engine'),
        'custom engine': app.get('custom engine'),
        'auto update': false,
        'session': true,
        'session store': 'mongo',
        'auth': true,
        'user model': 'Account',
        'cookie secret': process.env.COOKIE_SECRET,
        'compress': true,
        'frame_guard': 'deny',
        'mongo': config.get('mongo')
    });

    keystone.import('../../lib/models');
    keystone.start();
};

И, наконец, несколько примеров объектов сессии из MongoDB:

{ 
    "_id" : "GUL2jwhCvqZHO7Gqy8KCHod1qJmrl6j4", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"_garbage\":\"2016-08-17T13:01:53.475Z\",\"guestPageViews\":1,\"flash\":{}}", 
    "expires" : ISODate("2016-08-31T13:01:57.642+0000")
},
{ 
    "_id" : "C-4cuoyIGHgYM8hLGhQVOv3bRwChwkxq", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"_garbage\":\"2016-08-17T13:02:44.000Z\",\"guestPageViews\":1,\"flash\":{}}", 
    "expires" : ISODate("2016-08-31T13:02:51.473+0000")
},
{ 
    "_id" : "foE9ewU3eoJXIzkW97GSbMGNzFt2W4ww", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"_garbage\":\"2016-08-17T13:04:35.294Z\",\"guestPageViews\":1,\"flash\":{}}", 
    "expires" : ISODate("2016-08-31T13:04:38.979+0000")
},
{ 
    "_id" : "P8ugG4TFHJAuCzNS9aCMSybIS25uFtL1", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"userId\":\"56cadedbc580346a1bd0ee0c\",\"_garbage\":\"2016-08-17T23:57:03.615Z\",\"flash\":{}}", 
    "expires" : ISODate("2016-08-31T23:57:05.203+0000")
}

Можете ли вы определить, почему сессии не будут уничтожены?

1 ответ

Почему пользователь вошел в систему даже после закрытия браузера?

Очевидно, потому что это хорошая особенность. поддерживать сеанс даже после закрытия браузера. но как угодно Если вы хотите закончить сеанс при закрытии браузера, вы можете установить maxAge на -1

Почему не удаляются данные сеанса даже после выхода из системы?

Я думаю, именно это мог бы выбрать разработчик keystone.JS. Я просто смотрел на функцию выхода из системы в keystone / lib / session.js.

Здесь это вызывает req.session.regenerate.

вероятно, вместо этого он должен был вызвать req.session.destroy. Я просто попытался сделать это изменение и проверить. но все же я мог видеть сессии в базе данных. Тогда я думаю. решение - clear_interval

Другие вопросы по тегам