express - 当 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 无法保存到客户端。我想知道是否有人知道如何解决此问题或为什么会发生这种情况?
先感谢您。
解决方案
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();
});
推荐阅读
- javascript - 选择 2 选项 php ajax 后如何显示值
- mongodb - MongoDB-如何显示出现次数最多的时期?
- java - 我正在关注 youtube 教程,现在我遇到了问题,因为我想在 List 中返回,但它显示错误。我不明白错误
- c++ - 在没有 NuGet 的情况下将 gtest 添加到 Visual Studio 解决方案的最佳方法
- sql - 根据另一列求和然后减去值
- ios - 如何在 ios swift 中使用 Mailcore2 获取电子邮件?
- r - 匹配替换模式删除下一段
- ember.js - 有什么方法可以从 ember-modal 对话框中收听 eventbus?
- codeigniter - codeigniter 4 如何制作菜单栏链接
- oracle - 从 Plsql 中的光标获取 Clob 值