快速会话未为 Ipad 保存

BSt*_*ill 5 javascript node.js express express-session

我试图在用户登录时为用户保存会话变量。这适用于计算机,但当我使用SafariChromeiPad上尝试时,它不会保存。

这是我设置会话的地方:

app.set('trust proxy', 1)
app.use(session({
  secret: crypto.randomBytes(20).toString('hex'),
  resave: false,
  duration: 60 * 60 * 1000,
  activeDuration: 10 * 60 * 1000,
  saveUninitialized: false,
  cookieName: 'session',
  cookie: { secure: true }
}))
Run Code Online (Sandbox Code Playgroud)

我使用这条路线来设置用户:

.get('/checkLogin', (req,res) => {
  const loginCred = req.query;
  db.any('SELECT * FROM users WHERE user_name = $1 AND password = $2 LIMIT 1', [loginCred[0], loginCred[1]])
  .then(function (user) {
    req.session.user = user;
    req.session.save();
    res.end(JSON.stringify(user));
  })
  .catch(function (err) {
      throw err;
  })
})
Run Code Online (Sandbox Code Playgroud)

当我控制台记录此内容时,它已正确设置。然后当我在返回时调用会话时它不存在。我尝试添加保存,但仍然无效。我还添加maxage了会话变量以使其保持活动状态 3 天,但它仍然不起作用。

mel*_*lfy 2

您有 cookie {secure: true},它需要 HTTPS 连接以便浏览器将会话 cookie 与请求一起发送回。但建议确保它适合您的测试环境,并确保您在两台设备上都使用 HTTPS

https://www.npmjs.com/package/express-session#cookiesecure

此外,在开发或生产模式下,并在每次重新启动后更改您的秘密更改后重新启动 Express (使用函数 [crypto.randomBytes(20).toString('hex')] 而不是静态密钥),导致客户端的会话 ID重启后无效;无论如何,这都不重要,因为您没有持久会话设置,因此任何重新启动都会擦除所有会话。 如果您需要持久会话,请检查使用 memcached、数据库或文件而不是进程内存

https://www.npmjs.com/package/express-session#store


更新2022-10-19

使用 NGINX 作为前端的示例会话,当我偶然发现这一点时,我最终将其用于我的项目,我的 node.js/express 在 nginx>node.js 之间没有 SSL 设置并使用上游。

必须信任代理,我最终删除了:

// app.set('trust proxy', 1) // trust first proxy
Run Code Online (Sandbox Code Playgroud)

并将其添加到会话中

let session         = require('express-session');
let memsession      = require('connect-memcached')(session);

let sessionMiddleware = session({
    secret  : config.sessionSecret,
    key     : 'sid',
    cookie: {
        maxAge  : (86400 * 30 * 1000), // 30 days
    },

    proxy   : true,
    resave  : true,
    rolling : true,
    saveUninitialized: true,

    store   : new memsession({
        hosts: ['127.0.0.1:11211'],
        // secret: '_secret_' // Optionally use transparent encryption for memcache session data
    })
});
Run Code Online (Sandbox Code Playgroud)

不过,我不确定我们是否能让所有旧版 iPad 正常工作,但我们确实让我的 iPad 正常工作并转移了项目