Обновление / Обновление Экспресс Сессии

В моем приложении я ограничиваю некоторый доступ к некоторым действиям и страницам, если пользователь не вошел в систему. У меня есть:

var restrict = function(req, res, next) {
    if (!req.user) {
      console.log("USER isn't logged in.")
      return res.status(403).send('Access or action denied, please log in'); 
    }
    next();
}


app.get('/stocks', restrict, MainHandler.findAllStocksFromUser);
app.get('/stocks/:id', MainHandler.findStockByIdAndDates);
app.put('/stocks/:id/stockActions', restrict, MainHandler.handleStockAction);

По сути, я пытаюсь обновлять сеанс каждый раз, когда клиент отправляет запрос на сервер, чтобы сервер не выходил из системы пользователя / не разрушал сеанс, когда это не нужно. Для тестирования я хочу, чтобы сессия истекла / пользователь вышел из системы, если прошло 20 секунд, а пользователь не отправлял запросы на сервер. Я имею:

    app.use(session({secret: 'secret', saveUninitialized: true, resave: true, expires: new Date(Date.now() + (20000))}));

Затем я пытаюсь использовать промежуточное ПО для обновления даты окончания срока действия каждый раз, когда пользователь делает запрос:

// Session-persisted message middleware
app.use(function(req, res, next){
  req.session.cookie.expires = new Date(Date.now() + 20000);
  next();
});

Но если я вхожу в систему с клиента и щелкаю вокруг, вызывая запросы к серверу, я все равно получаю ошибку входа в систему через 20 секунд, несмотря на попытку "обновить" сеанс в промежуточном программном обеспечении. Я также пытался использовать maxAge, используя ту же стратегию с промежуточным ПО. Есть идеи? Спасибо!

2 ответа

Вы можете попытаться определить вашу сессию следующим образом

app.use (
   session ({
      secret: "secret",
      saveUninitialized: true,
      resave: true,
      cookie: {
         expires: 20 * 1000
      }
   })
);

а затем обновить сеанс с помощью

req.session.touch()

или вы можете определить свою сессию как

app.use (
   session ({
      secret: "secret",
      saveUninitialized: false,
      resave: true,
      rolling: true,
      cookie: {
         expires: 20 * 1000
      }
   })
);

и он автоматически возобновит сеанс, и срок его действия истечет только после простоя значения в переменной expires.

express-session поддерживает основанный на продолжительности maxAge настройка, которая будет работать лучше, чем установка фиксированной даты для всех сеансов. Таким образом, ваше использование промежуточного программного обеспечения должно выглядеть следующим образом:

app.use(session({
  secret: 'secret',
  saveUninitialized: true,
  resave: true,
  maxAge: 20000
}));

Далее, чтобы обновить срок действия сессии, вы можете просто позвонить req.session.touch(); если это все, что вы делаете для сеанса и его содержимого.

Документация содержит много другой полезной информации о контроле истечения времени сеанса и связанных с ним темах.

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