我设置了一个快速会话来使用存储在数据库中的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 有关,但这似乎并没有解决它,而且页面说它不会影响同站点请求,而我的总是这样。
不确定您在哪里托管服务器,但在解决类似问题后,您可以使用以下行,可能是您的服务器托管在 Heroku 等地方,按照另一个堆栈溢出线程PassportJS 在 http 和 https 之间切换
app.set('trust proxy', 1)
我遇到了同样的问题,因为部署时没有保存 cookie。如果您的后端服务器和前端应用程序托管在不同的域上,即不同的IP。它在firefox上工作的原因它仍然显示警告如果sameSite属性值是未提供并且但是允许在浏览器中设置cookie以实现跨域上下文。然而,在所有基于 chromium 的应用程序中,如果跨域上下文的 cookie 中 sameSite 属性值是 notprovided,则 cookies not 是 set 或 saved因此,浏览器将这些 cookie not sent 与 with request 一起发送到服务器以获取用户的数据。
sameSite:'none'
,指示 cookie 是否意图在跨站点上下文中使用。secure: true
时,Secure 属性必须设置为 true
'none'
。为了保护用户数据免遭跨站点请求伪造,大多数浏览器采用策略,这将反过来防止您的cookie被保存。 了解更多信息查看文档
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',
}),
})
);
const 会话选项 = { 秘密:“我的秘密”, 重新保存:假, 保存未初始化:true, 曲奇饼:{ 过期:Date.now() + 7 * 24 * 60 * 60 * 1000, 最大年龄:7 * 24 * 60 * 60 * 1000, }, }; app.use(会话(sessionOptions));
在你的所有路线之前使用这个,否则在 chrome 中将不起作用,我遇到过它,现在它解决了