Express Session cookie 未保存在 Chrome 中?

问题描述 投票:0回答:3

我设置了一个快速会话来使用存储在数据库中的cookie。这在 Firefox 中工作得很好,但它似乎从不保存 cookie,因此客户端永远不会反映会话。

app.use(expressSession({ 
  secret: data[0],
  cookie: { 
    httpOnly: false,
    secure: true,
    maxAge: 14 * 24 * 60 * 60 * 1000, //14 days
  },
  store: new connectMongo({mongooseConnection: mongoose.connection}),
  resave: false,
  saveUninitialized: false,
}));

在 Firefox 中,它肯定会将 cookie 保存为 connect.sid,并在页面加载之间保存数据:

在 Chrome 中,它会保存我的一些浏览器端设置的 Cookie,例如分析和我使用 JavaScript 执行的 Cookie,但 connect.sid 从未保存。

编辑:所以我发现它与

secure: true
有关,但如果不需要的话我不想禁用它。

我认为这与 xhr.withCredentials 有关,但这似乎并没有解决它,而且页面说它不会影响同站点请求,而我的总是这样。

node.js express session cookies express-session
3个回答
0
投票

不确定您在哪里托管服务器,但在解决类似问题后,您可以使用以下行,可能是您的服务器托管在 Heroku 等地方,按照另一个堆栈溢出线程PassportJS 在 http 和 https 之间切换

app.set('trust proxy', 1)

0
投票

我遇到了同样的问题,因为部署时没有保存 cookie。如果您的后端服务器和前端应用程序托管在不同的域上,即不同的IP。它在firefox上工作的原因它仍然显示警告如果sameSite属性未提供并且但是允许在浏览器中设置cookie以实现跨域上下文。然而,在所有基于 chromium 的应用程序中,如果跨域上下文的 cookie 中 sameSite 属性值是 notprovided,则 cookies notsetsaved因此,浏览器将这些 cookie not sentwith request 一起发送到服务器以获取用户的数据。

  • 然后您需要设置
    sameSite:'none'
    ,指示 cookie 是否意图跨站点上下文中使用。
  • 此外,当 SameSite 属性 设置为 secure: true 时,
    Secure 属性
    必须设置为 true
    'none'
    。为了保护用户数据免遭跨站点请求伪造,大多数浏览器采用策略,这将反过来防止您的cookie保存了解更多信息查看文档
  • 如果 secure 设置为 true,并且您对服务器的 request 是通过 HTTP sent,则 cookie 将不会保存在浏览器中。检查mdn文档
  • 如果您的 node.js 位于 proxy 后面并且正在使用
    secure: true
    ,则需要在 Express 中设置 “信任代理”
// app.set('trust proxy', 1); //either use this or set proxy:true when setting up 
app.use(
    session({
        secret: 'session secret',
        cookie: {
            sameSite: 'none',
            secure: true,  
            maxAge: 30000
        },
        proxy: true, //or use this
        resave: false,
        saveUninitialized: false,
        store: MongoStore.create({
            mongoUrl: 'database uri',
        }),
    })
);

0
投票

const 会话选项 = { 秘密:“我的秘密”, 重新保存:假, 保存未初始化:true, 曲奇饼:{ 过期:Date.now() + 7 * 24 * 60 * 60 * 1000, 最大年龄:7 * 24 * 60 * 60 * 1000, }, }; app.use(会话(sessionOptions));

在你的所有路线之前使用这个,否则在 chrome 中将不起作用,我遇到过它,现在它解决了

© www.soinside.com 2019 - 2024. All rights reserved.