Node.js、Angular、express会话:Chrome 80由于cookie策略(sameSite cooki



我有一个Node.js,Angular应用程序。(Node.js服务器用TypeScript编写(。Node.js服务器在AmazonEC-2实例上运行,Angular客户端在另一台服务器上。

对于登录会话,我使用express会话。我没有在应用程序中使用cookie,所以我认为问题出在快速会话cookie上在Firefox上它可以正常工作,但在谷歌Chrome(80.0.3987.149(上它不工作:Chrome不会保存会话(所以我不能离开登录页面(并警告:

与位于的跨站点资源关联的cookiehttp://addressof.myserverapp.com/设置为没有SameSite属性。它已被阻止,因为Chrome现在只在设置了SameSite=NoneSecure的情况下提供带有跨站点请求的cookie。您可以在"应用程序">"存储">"Cookie"下的开发工具中查看Cookie,并在https://www.chromestatus.com/feature/5088147346030592和https://www.chromestatus.com/feature/5633521622188032.

在Node.js服务器中,我这样设置快速会话:

import cookieParser from 'cookie-parser';
app.use(cookieParser(secret));
app.use(session({
secret: secret,
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: false,
maxAge: null,
secure: true,
sameSite: 'none'
},
store: sessionStore // MySqlStore - express-mysql-session
}));

我还试图用这个代码片段(来自https://github.com/expressjs/session/issues/725#issuecomment-605922223(

Object.defineProperty(session.Cookie.prototype, 'sameSite', {
// sameSite cannot be set to `None` if cookie is not marked secure
get() {
return this._sameSite === 'none' && !this.secure ? 'lax' : this._sameSite;
},
set(value) {
this._sameSite = value;
}
});

服务器npm包:

"cors": "^2.8.5",
"cookie-parser": "^1.4.5",
"express": "^4.17.1",
"express-mysql-session": "^2.1.3",
"express-session": "^1.17.0",
Npm version: 6.13.4
Node version: 12.16.1

我花了好几天的时间来解决这个问题,想知道我做错了什么。。。

这里的问题是您通过HTTP访问网站,但cookiesecure设置为true,这意味着它将仅通过HTTPS发送。

如果在express-sessioncookie选项中设置secure: false,它将起作用:

import cookieParser from 'cookie-parser';
app.use(cookieParser(secret));
app.use(session({
secret: secret,
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: false,
maxAge: null,
// allow the cookie to be sent via HTTP ("true" means "HTTPS only)
secure: false, 
sameSite: 'lax'
},
store: sessionStore
}));

最新更新