Node.js、Angular、express-session: Chrome 80因为cookie策略(sameSite cookie)而不能保存会话

6

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

对于登录会话,我使用express-session。应用程序中没有使用cookies,因此我认为问题出在了express-session cookies。 在Firefox上可以正常工作,但是在Google Chrome(80.0.3987.149)上却无法正常工作:Chrome不保存会话(因此我无法离开登录页面)并发出以下警告:

http://addressof.myserverapp.com/相关联的cookie未设置SameSite属性,被阻止了。现在,Chrome仅在带有SameSite=NoneSecure设置的跨站点请求中传递cookie。您可以在“应用程序>存储>Cookie”下查看开发人员工具中的cookie,并在https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032中查看更多详细信息。

在Node.js服务器中,我设置了express-session的方式如下:

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

我花了好几天时间解决这个问题,找出自己错在哪里...


你能否提供一个被发送的 Set-Cookie 头部的例子?正如你所指出的,express-session 应该支持 SameSite=None; Secure 属性,因此我们需要查看正在发送和接收的内容。我们在这里有一个更完整的调试指南:https://www.chromium.org/updates/same-site/test-debug - rowan_m
1个回答

0
问题在于您正在通过HTTP访问网站,但是cookie的“secure”设置为“true”,这意味着它只能通过HTTPS发送。
如果您在“express-session” cookie选项中设置“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
}));

2
在Chrome 80+中,sameSite: 'none'secure: false不兼容。 - Karen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接