我目前正在将Express单点登录应用程序迁移到新的身份提供者。此新的IdP需要以下会话标准。
如果我正确地理解了这一点,则会话应该在连续1个小时的空闲时间之后或在最初生成会话3个小时后终止,以先到者为准。正在使用的相关npm软件包是express-session 1.15.6和connect-mongo 2.0.1。至此,我已经能够实现这两个会话参数,但不能同时实现。我可以...
如上所述,我无法同时使这两个功能同时工作。由于我几乎没有网络开发人员的经验,因此任何见解都会有所帮助。我已经研究过更改index TTL,这给了我一些最初的希望。我相信我可以在会话对象中添加另一个日期字段,该字段不依赖于会话cookie过期值,即createdAt日期。然后,我可以使用cookie过期作为超时组件,并使用生命周期组件的createdAt日期。不幸的是我没有运气将此值添加到会话对象。我是否忽略了一个明显的快速会话选项或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 :(得分: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()
})