Express JS/Node JS:当secure=true,sameSite:'none'时,浏览器不设置cookie

18

如果我在本地运行服务器,则会设置cookie,但当其托管在线上时:

  1. 如果secure=false,sameSite: 'none'那么我会收到以下错误

Cookie“connect.sid”将很快被拒绝,因为它的“sameSite”属性设置为“none”或无效值,没有 “secure”属性。要了解有关“sameSite”属性的更多信息,请阅读: https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite

然后我尝试使用secure=true

  1. 如果secure=true,sameSite: 'none'那么我知道它应该有效

它可以在本地托管服务器时工作并设置Cookie。 但是当它在heroku上托管时,Cookie未设置,我没有收到任何错误。

似乎客户端网站不安全,但在url框中显示https

我在这里做错了什么?

session config:

router.use(
    session({
        cookie: {
            secure: true,
            maxAge: 86400,
            sameSite: "none",
        },
        secret: process.env.SESSION_SECRET,
        resave: false,
        saveUninitialized: false,
    })
);

注意:我已经启用了带有凭据的CORS

XHR的Cookies标签为空。前端和后端在Heroku上分别托管。使用XMLHttpRequest发送的POST请求,其中withCredentials设置为true。

XHR POST https://sih-drs-prototype-backend-2.herokuapp.com/api/outrages/login [HTTP/1.1 200 OK 1625ms]

POST https://sih-drs-prototype-backend-2.herokuapp.com/api/outrages/login 状态码 200,版本 HTTP/1.1,传输367 B(2 B 大小)。

Access-Control-Allow-Credentials
    true
Access-Control-Allow-Origin
    https://tempautocomplete.herokuapp.com
Connection
    keep-alive
Content-Length
    2
Content-Type
    application/json; charset=utf-8
Date
    Sun, 12 Jul 2020 14:06:42 GMT
Etag
    W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
Server
    Cowboy
Vary
    Origin
Via
    1.1 vegur
X-Powered-By
    Express
    
Accept
    */*
Accept-Encoding
    gzip, deflate, br
Accept-Language
    en-US,en;q=0.5
Connection
    keep-alive
Content-Length
    46
Content-Type
    application/json;charset=UTF-8
Host
    sih-drs-prototype-backend-2.herokuapp.com
Origin
    https://tempautocomplete.herokuapp.com
Referer
    https://tempautocomplete.herokuapp.com/static/
User-Agent
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0

我有同样的问题,我认为这是因为我的域名没有正确的SSL证书。因此,HTTPS到HTTP的转换会导致cookie失效。 - Kevin Toet
编辑:没有设置正确的SSL,仍然没有保存Cookie。 - Kevin Toet
我有完全相同的问题,有人有解决方案吗? - Abhishek Gautam
有任何解决方案吗? - Manish Salunke
数月后,完全相同的问题。无法避免它。 - Ric
显示剩余4条评论
2个回答

3
问题不在于express-session,它很好用。 当响应来自第三方域名时,浏览器不允许使用cookie。

如果你正在寻找解决方法,请尝试这个npm包: should-send-same-site-none https://www.npmjs.com/package/should-send-same-site-none


明确一下,浏览器并不会拒绝cookie。相反,cookie会以发送响应的第三方域名的名称存储。

当本地主机进行请求和响应时,由于请求和响应来自同一个域(localhost),因此可以完美运行。


1
问题在于当我设置 SameSite 为 none 时,它确实被设置了,但是当我设置 secure: true 时,代码根本没有将 cookie 发送到浏览器。不知道问题出在哪里。 - Abhishek Gautam
1
如果 secure 为真,则 cookie 只会在网站安全(启用 HTTPS)的情况下设置。 - Prashan
你尝试在Chrome中查看XHR响应了吗?看看是否收到了cookie。 - Prashan
在响应cookie选项中设置sameSite:none时,出现错误option sameSite is invalid。这是因为Sails使用的是express@4.16.x,它使用的是cookie@0.3.0,该版本不支持cookie中的SameSite=None选项。此支持已添加到cookie包的版本0.4.x中。要解决此问题,我们可以将express更新到4.17.x,该版本使用cookie@0.4.x - VELDAS R DURAI
@VELDASRDURAI,我希望这样可以解决问题!我已经升级到那些版本号了,但是当我使用sameSite和secure时,在响应头中仍然没有cookie。如果我只使用sameSite,它会创建并发送一个cookie,但不允许被删除。 - Ric
显示剩余2条评论

2

原问题中发布的设置是正确的,只有一件事情缺失,因为Heroku可能正在使用代理。我遇到了同样的问题,当我添加以下内容时:

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

Express服务器托管在Heroku上,最终向浏览器发送了Set-Cookie头。


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