NodeJS Express Session cookie未保存在Chrome中?

siotufzp  于 2023-06-22  发布在  Node.js
关注(0)|答案(2)|浏览(150)

我有一个快速会话设置为使用存储在数据库中的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,比如analytics和我用JavaScript做的cookie,但是connect.sid从来没有保存过。

编辑:所以我发现它与secure: true有关,但如果没有必要,我不想禁用它。
我以为它与xhr.withCredentials有关,但似乎没有解决它,加上页面上说,它不影响相同的网站请求,我的总是。

brtdzjyr

brtdzjyr1#

不知道你在哪里托管你的服务器,但在遇到类似的问题后,你可以使用下面的行,它可能是你的服务器托管在像heroku这样的地方,按照这个其他堆栈溢出线程PassportJS callback switch between http and https

app.set('trust proxy', 1)
jhkqcmku

jhkqcmku2#

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

  • 然后需要设置sameSite:'none',该sameSite:'none'表示cookie是否 * 打算用于跨站点上下文**。
  • 另外,当SameSite属性设置为'none'时,Secure属性必须设置为truesecure: true。为了保护用户数据不被跨站请求伪造,大多数浏览器都采用了策略,该策略将防止您的cookie保存**。更多信息查看文档
  • 如果secure设置为true,且您对服务器的请求是通过HTTP发送**的,则浏览器中不会保存cookie。检查mdn文档
  • 如果您的node.jsproxy后面,并且使用的是secure: true,则需要在express中设置**“trust proxy”**:
// 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',
        }),
    })
);

相关问题