浏览器未为显式域保存Cookie

时间:2018-07-22 05:04:35

标签: express cookies xmlhttprequest session-cookies fetch-api

在服务器上,我正在使用express.js,在浏览器中,我正在使用访存API。我使用默认域发送cookie,然后浏览器正确设置它并随后续请求一起发送。但是,当我将域设置为父域时,不会设置cookie。我的理解是it should

假设我的代码是从“ my.example.com”端口8080提供的。那么我的服务器代码将如下所示:

response.cookie("token",token,{
    encode:String,
    domain:".example.com",
    expires: new Date(Date.now()+86400000000),
    secure:false}
)

在客户端上,我的代码如下:

fetch("/login", {
    credentials: "include", // also tried "same-origin"
    mode:"cors", // also tried omitting
    headers:new Headers( {
         // authentication data is here
    })
})

起初我以为这是父域,但如果我使用任何域,似乎cookie不会保存。

因此以下所有内容均不会保存在客户端上:

    domain:".example.com",

    domain:".example.com:8080",

    domain:"my.example.com",

    domain:"my.example.com:8080",

但是如果我省略“域”,那么它会被保存。

需要明确的是,当我在Chrome开发人员工具中查看回复时,我看到收到了cookie-出于某种原因它没有得到保存。

我需要能够为任何其他子域中的任何子域设置此Cookie。根据我的阅读,a.example.com将cookie设置为.example.com应该没有问题,以便b.example.com可以使用它。

更新:我也尝试使用XMLHttpRequest,并得到相同的行为!

更新2:我也无法直接通过具有父域的javascript设置cookie,例如这有效:

document.cookie=("token=<...>; Domain=my.example.com; Path=/")

但这不是

document.cookie=("token=<...>; Domain=.example.com; Path=/")

从我读过的所有内容来看,该行应该有效,但对我而言不起作用。我认为这里应该没有问题是正确的吗?如果是这样,我该如何解决为什么无法设置Cookie的问题?我已经尝试过的事情:

  1. my.example.com指向127.0.0.1。使其指向另一个非本地主机地址,没有解决该问题。

  2. my.example.com实际上不是.com地址,也不是其他5个硬编码地址之一,该地址只能使用一个点。使其指向.com地址,但未解决问题。

  3. 也许无法从控制台设置cookie以进行测试。直接从服务器加载的javascript代码中尝试了我所有的更改,没有解决问题。

  4. 标题的顺序也许很重要。将路径移到域之前

  5. 也许情况很重要。将“路径”和“域”更改为全部小写。没有解决问题。

  6. 也许“路径”不需要存在。删除它并不能解决问题。

  7. 从cookie的元素之间删除了空格。没有效果。

  8. 也许是一个奇怪的字符使需要编码的东西变得混乱。已检查并且令牌中仅包含字母数字键。 Cookie的总长度只有大约100个字节,远低于最大长度,因为只有一个Cookie。

  9. 也许我的域名有些奇怪,浏览器不喜欢上面没有提到的内容。所以我去了www.example.com,打开控制台并输入:

    document.cookie =“ token = 1; domain = .example.com; path = /”

并且成功了!。但是,我对自己的.com地址和example.com地址之间可能存在的区别感到困惑!我的域的格式不是www.myhostname.com,但是我看不到任何内容表明该子域必须是“ www”。浏览器中是否可能有某些东西被列入黑名单或以其他方式不同地对待某些域? (它来自一个动态的DNS托管站点,尽管我看不到这有什么用,因为IP地址实际上从未改变,并且具有很长的TTL。)

  1. 我的服务器在端口8080上运行,而不是在端口80上运行。我将其切换为仅运行端口80,以查看是否有任何区别。没有。

1 个答案:

答案 0 :(得分:5)

太好了。我浪费了很多时间来解决这个问题,却发现浏览器是actively blocking me,因为我的子域位于public suffix black hole list中。