Express会话-配置会话超时和生存时间

时间:2018-08-16 04:02:03

标签: session cookies express-session connect-mongo

我目前正在将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过期作为超时组件,并使用生命周期组件的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
    })
}));

1 个答案:

答案 0 :(得分:0)

我没有时间测试任何东西,但这也许可以帮助您指出正确的方向。

可以根据每个请求更改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()
})