1

我目前正在将 Express 单点登录应用程序迁移到新的身份提供者。这个新的 IdP 需要以下会话标准。

  1. 会话超时:1 小时
  2. 会话寿命:3 小时

如果我对此的解释正确,则会话应在连续 1 小时的空闲时间或会话最初生成 3 小时后终止,以先发生者为准。正在使用的相关 npm 包是 express-session 1.15.6 和 connect-mongo 2.0.1。在这一点上,我已经能够实现这两个会话参数,但不能同时实现。我也可以...

  1. 通过将会话 cookie maxAge 设置为 1 小时并将会话滚动设置为 true 来实现 1 小时会话超时,从而在每个响应中重置 cookie expires 字段。如connect-mongo中所述,如果 cookie 过期,它将应用于会话 ttl 字段。因此,只要不发生超时,更新 cookie 就会有效地无限期地更新会话。
  2. 通过将会话 cookie maxAge 设置为 3 小时并将会话滚动设置为 false 来实现 3 小时会话生命周期。现在会话 ttl 不会在每次响应时都重置,并且在会话创建 3 小时后它将被终止。

如上所述,我不能同时让这两个工作。任何见解都会有所帮助,因为我的网络开发经验很少。我研究过更改索引 TTL,这给了我一些初步希望。我相信我可以向会话对象添加另一个不依赖于会话 cookie 过期值的日期字段,即 createdAt 日期。然后,我可以使用 cookie expires 作为超时组件,并将 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
    })
}));
4

1 回答 1

0

我没有时间测试任何东西,但也许这有助于为您指明正确的方向。

可以更改每个请求的 cookie.maxAge,因此您可以每次计算 maxAge。

来自express-session 文档

或者 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()
})
于 2019-01-22T11:10:32.007 回答