首页 > 解决方案 > 当 SameSite 设置为“无”且安全设置为 true 时,Express cookie-session 不保存 cookie

问题描述

我正在使用 cookie-session 和 passportjs 来验证我的快速应用程序中的用户。当我像这样初始化我的 cookieSession 时:

app.use(cookieSession({
    maxAge: 24 * 60 * 60 * 1000,
    keys: ['key1']
}));

我的 cookie 已成功保存到客户端。但是,我正在进行的项目需要跨站点请求。因此,cookie 的secure 属性必须设置为true,SameSite 属性必须设置为none。在文档中,这些值可以设置如下:

app.use(cookieSession({
    maxAge: 24 * 60 * 60 * 1000,
    secure: true,
    sameSite: 'none',
    keys: ['key1']
}));

但是,当我这样做时,cookie 无法保存到客户端。我想知道是否有人知道如何解决此问题或为什么会发生这种情况?

先感谢您。

标签: expresscookiespassport.jssamesitecookie-session

解决方案


Luka Darsalia的回答告诉我,至少在我的情况下,服务器拒绝向secure:true客户端发送 cookie,因为它认为客户端不安全(由于request.protocol存在http而不是https)。

起初我对此感到困惑,因为我的地址栏显示https. 但后来我记得那https只是我的浏览器和 Cloudflare CDN 之间的连接——Cloudflare CDN 和我的实际服务器之间的连接仍在使用http

因此,要修复它,我只需要确保cookie-session(更具体地说,cookie包中的这一行)连接是安全的,然后继续发送带有标志的 cookie。secure:true

为此,我只是在中间件之后添加了以下cookieSession中间件:

// your existing cookieSession init here
app.use(cookieSession({
    [...]
    secure: true,
    sameSite: "none",
}));

// enable the "secure" flag on the sessionCookies object
app.use((req, res, next)=>{
    req["sessionCookies"].secure = true;
    next();
});

推荐阅读