Экспресс-сеанс - настройка времени ожидания и продолжительности сеанса

В настоящее время я переносю приложение Express Single Sign on на нового поставщика удостоверений. Этот новый IdP требует следующих стандартов сеанса.

  1. Тайм-аут сеанса: 1 час
  2. Продолжительность сеанса: 3 часа

Если я правильно интерпретирую это, сеанс должен завершиться через 1 час подряд простоя или через 3 часа после того, как сеанс был изначально создан, в зависимости от того, что произойдет раньше. Соответствующие используемые пакеты npm: express-session 1.15.6 и connect-mongo 2.0.1. На данный момент я смог достичь обоих параметров сеанса, но не одновременно. Я могу либо...

  1. Реализуйте время ожидания сеанса в 1 час, установив для cookie сеанса maxAge значение 1 час, а для сеанса будет установлено значение true, поэтому при каждом ответе поле cookie истекает. Как указано в connect-mongo, если срок действия файла cookie истекает, он применяется к полю ttl сеанса. Таким образом, обновление cookie эффективно продлевает сеанс до бесконечности, пока не истечет время ожидания.
  2. Внедрите продолжительность сеанса 3 часа, установив для cookie сеанса maxAge значение 3 часа, а для сеанса - значение false. Теперь сеанс ttl не сбрасывается при каждом ответе, и через 3 часа после создания сеанса он будет прерван.

Как указано выше, я не могу заставить их работать одновременно. Любое понимание было бы полезно, так как у меня очень мало опыта веб-разработки. Я исследовал изменение индекса TTL, что дало мне некоторую первоначальную надежду. Я полагал, что мог бы добавить другое поле даты к объекту сеанса, которое не зависело от значения истечения срока действия cookie сеанса, даты createAt. Затем я могу использовать cookie истекает в качестве компонента тайм-аута и дату createAt для компонента времени жизни. К сожалению, мне не повезло, добавив это значение в объект сеанса. Я пропускаю очевидную опцию экспресс-сеанса или настройку connect-mongo, которая решит мою проблему?

    app.use(session({
    secret: keys.expressSession.pw,
    saveUninitialized: false, // don't create a session for anonymous users
    resave: false, // save the session to store even if it hasn't changed
    rolling: true, // reset expiration on every response
    name: "definitely not a connect cookie",
    cookie: {   
        httpOnly: true, 
        maxAge: 60*1000, // one minute timeout
        //maxAge: 180*1000 // three minute lifetime
        secure: false // https only, when true add proxy trust
    },
    store: new MongoStore({
        url:keys.mongodb.dbURI,     
        // ttl: value of cookie maxAge, set redundantly in case cookie has no expiry
    })
}));

0 ответов

У меня нет времени что-либо тестировать, но, возможно, это поможет вам указать правильное направление.

Можно изменить cookie.maxAge для каждого запроса, чтобы вы могли рассчитывать maxAge каждый раз.

Из документов экспресс-сессии

В качестве альтернативы req.session.cookie.maxAge вернет время, оставшееся в миллисекундах, которое мы также можем переназначить новым значением, чтобы соответствующим образом настроить свойство.expires.

Так что промежуточное ПО может выглядеть примерно так

app.use(function (req, res, next) {
  const hour = 3600
  const threeHours = hour * 3
  const creationDate = req.session.createdAt // set this when the session is initialized
  const expires = creationDate + threeHours // expiration date
  const ttl = expires - Date.now() // maximum time to life

  if (ttl < hour) {
    // if the maximum time to live is less than the one hour timeout, use it as maxAge
    req.session.cookie.maxAge = ttl
  } else {
    // otherwise just stick with the "idle" timeout of 1 hour
    req.session.cookie.maxAge = hour
  }
  next()
})
Другие вопросы по тегам