Я делаю SPA с функцией входа в систему. Первоначально я реализовал обработку сеанса с помощью «express-session», чтобы mongoDB _id пользователя сохранялся, и они могли нажать «обновить», не выходя из системы, что сработало отлично.
Отсюда я хочу разрешить использование флажка «запомнить меня», который будет контролировать долгосрочные (повторные) посещения сайта. Таким образом, если «запомнить меня» не отмечено, во время данного посещения обработка сеанса работает так же («кнопка обновления» сохраняет вход в систему), но данные сеанса теряются после закрытия браузера. И наоборот, проверка «запомнить меня» сохраняет их данные для входа в мою базу данных (используя для этого «connect-mongo»), сохраняя вход в систему между полными посещениями сервера (дни, недели и т. д.).
Проблема, похоже, заключается в том, что файл cookie сеанса браузера и запись сеанса mongodb неразрывно связаны друг с другом, поэтому я не могу изменить/удалить одно, не затрагивая другое. Если это даже правильный подход?
Итак, здесь я получаю все, что мне нужно:
var express = require('express');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var fs = require('fs');
var bodyParser = require('body-parser');
var dbHdlr = require('./Server/dbHdlr.js')();
... настроить обработку сеанса с хранилищем...
var mongoStore = new MongoStore({
url: 'mongodb://' + dbHdlr.GetConnectionURL(),
ttl: 7 * 24 * 60 * 60, // Session saves for 7 days
});
var SessionFunc = session({
secret: 'SomeKindOfSessionSecretIReallyDontKnowMuchAbout',
cookie: {
maxAge: 7 * 24 * 60 * 60 * 1000 // Cookie expires in 7 days
},
saveUninitialized: false,
resave: false,
store: mongoStore
});
app.use('/' , SessionFunc);
... Применить функцию входа в систему с помощью флажка «запомнить меня» (используя свойство «постоянно» в этом контексте для обозначения долгосрочного сохранения) ...
app.post('/LoginData', function(req, res){
dbHdlr.GetAccountID({ email: req.body.email, password: req.body.password }, function(resObj) {
if(resObj.success) {
req.session.accountID = resObj.accountID;
if(req.body.remember)
req.session.persist = true;
else
req.session.persist = false;
}
res.json(resObj);
});
});
... единая точка входа, где я изначально создаю страницу исключительно на основе статуса входа. И здесь я подумал, что если они решат не иметь долгосрочного сохранения, я просто удалю запись из магазина? Или сбросить ttl до одной секунды, может быть? Я не знаю, как это сделать. Удаление записи в магазине убивает все это, так что я даже не могу нажать «обновить», не выходя из системы, хотя это не было проблемой до того, как магазин был реализован...
app.get('/', function (req, res) {
if(req.session.accountID) {
res.render('index.ejs', { loggedIn: true });
if(!req.session.persist)
mongoStore.destroy(req.sessionID, function(error) {});
}
else
res.render('index.ejs', { loggedIn: false });
});
Мысли? Можно ли этого добиться, не зная явно программно, когда пользователь нажимает «обновить» по сравнению с изменением сайтов/закрытием браузера?