Экспресс-сеанс - настройка времени ожидания и продолжительности сеанса
В настоящее время я переносю приложение Express Single Sign on на нового поставщика удостоверений. Этот новый IdP требует следующих стандартов сеанса.
- Тайм-аут сеанса: 1 час
- Продолжительность сеанса: 3 часа
Если я правильно интерпретирую это, сеанс должен завершиться через 1 час подряд простоя или через 3 часа после того, как сеанс был изначально создан, в зависимости от того, что произойдет раньше. Соответствующие используемые пакеты npm: express-session 1.15.6 и connect-mongo 2.0.1. На данный момент я смог достичь обоих параметров сеанса, но не одновременно. Я могу либо...
- Реализуйте время ожидания сеанса в 1 час, установив для cookie сеанса maxAge значение 1 час, а для сеанса будет установлено значение true, поэтому при каждом ответе поле cookie истекает. Как указано в connect-mongo, если срок действия файла cookie истекает, он применяется к полю ttl сеанса. Таким образом, обновление cookie эффективно продлевает сеанс до бесконечности, пока не истечет время ожидания.
- Внедрите продолжительность сеанса 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()
})