【问题标题】:Express Session - Configure Session Timeout and Lifetime快速会话 - 配置会话超时和生命周期
【发布时间】:2019-01-22 23:08:46
【问题描述】:

我目前正在将 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 过期字段。如connect-mongo 中所述,如果 cookie 过期,它将应用于会话 ttl 字段。因此,只要不发生超时,更新 cookie 就会有效地无限期地更新会话。
  2. 通过将会话 cookie maxAge 设置为 3 小时并将会话滚动设置为 false 来实现 3 小时会话生命周期。现在会话 ttl 不会在每次响应时都重置,并且会在会话创建 3 小时后终止。

如上所述,我不能同时让这两个工作。任何见解都会有所帮助,因为我的网络开发经验很少。我研究过更改index 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
    })
}));

【问题讨论】:

    标签: session cookies express-session connect-mongo


    【解决方案1】:

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

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

    来自express-session docs

    或者 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()
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2018-12-06
      • 2011-08-21
      • 2016-11-21
      • 2014-08-03
      • 2017-11-08
      • 1970-01-01
      相关资源
      最近更新 更多