【问题标题】:Express JS/ Node JS : Browsers are not setting cookie when secure=true, sameSite: 'none'Express JS/ Node JS:当secure=true,sameSite:'none'时,浏览器没有设置cookie
【发布时间】:2020-11-01 20:04:47
【问题描述】:

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

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

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

然后我尝试使用secure=true

  1. 如果 secure=true, sameSite: 'none' 那么我知道它应该可以工作,

当服务器在本地托管时,它可以工作并且设置 cookie。 但是当它托管在heroku中时,cookie没有设置,我没有 错误。

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

我在这里做错了什么?

会话配置:

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

注意:我已经启用了凭据设置为 true 的 cors XHR cookie 选项卡中的 cookie 选项卡为空 前端和后端分别托管在heroku中 XMLHttpRequest 用于发送带有设置为 true 的 withCredentials 的 post 请求。

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

发布 https://sih-drs-prototype-backend-2.herokuapp.com/api/outrages/login 状态200 好的 版本HTTP/1.1 Transferred367 B(2B大小)

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
  • edit 没有设置正确的 ssl,仍然没有保存 cookie。
  • 确保您的服务器上的 Access-Control-Allow-Origin 未设置为通配符 *。
  • 其实我发现了。浏览器确实在设置 cookie,但它没有在客户端域中设置它,而是在服务器域名中设置。我尝试在 express-session 字段中设置域字段,但随后 cookie 被浏览器拒绝。
  • 显然如果cookie的域值与服务器的域不同,它会被浏览器视为无效cookie。 developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie 这不是 express-session 的错,浏览器是罪魁祸首。所以最好在 REST API 中使用 JWT 令牌进行身份验证。

标签: node.js express cookies express-session


【解决方案1】:

问题不在于 express-session,它完成了它的工作。 当响应来自第三方域时,浏览器不允许使用 cookie。


如果您正在寻找解决方法试试这个 npm 包: 应该发送相同的站点无 https://www.npmjs.com/package/should-send-same-site-none


需要明确的是,浏览器不会拒绝 cookie。相反,cookie 以发送响应的第 3 方域名的名称存储。

在本地托管时它工作得非常好,因为请求和响应将来自同一个域(本地主机)

【讨论】:

  • 问题是当我设置 SameSite none 时,是的,它正在设置,但是当我设置 secure : true 时,代码根本没有将 cookie 发送到浏览器。不知道是什么问题。
  • 如果安全为真,那么只有当网站是安全的(启用 HTTPS)时才会设置 cookie。
  • 你试过在 chrome 中查看 xhr 响应吗?查看是否收到 cookie。
  • 否,设置secure: true后,chrome不接收cookie。
  • @Prashan 您可以尝试仅使用 HTTP cookie,它们更安全,并且还可以使您免于跨站点脚本,根据我的经验 withcredentials=true & http only =true 并具有适当的 CORS 设置可以航行你通过。看看这篇文章medium.com/@itsgosho2/…
【解决方案2】:

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

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

Set-Cookie 标头最终从托管在 Heroku 上的 Express 服务器发送到浏览器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2021-02-14
    • 2020-09-24
    • 2021-09-03
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多