浏览器未在后续请求中发送 cookie

Posted

技术标签:

【中文标题】浏览器未在后续请求中发送 cookie【英文标题】:Browser not sending cookie in subsequent request 【发布时间】:2018-05-19 01:08:52 【问题描述】:

使用 cookie 进行用户识别的项目。

当用户到达时,它调用服务(在 localhost 中运行),服务发送带有响应头的 cookie 如下所示:

curl 'http://127.0.0.1:8000/api/v1.0/tracking' -X OPTIONS -H 'Access-Control-Request-Method: POST' -H 'Origin: http://local.com:8080' -H 'Access-Control-Request-Headers: content-type,x-forwarded-for' --compressed

响应头如下所示:

HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: 60
Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, x-forwarded-for
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, PATCH, GET
Content-Length: 0
Content-Type: text/plain; charset=utf-8
Set-Cookie: id=random_id_123_123; expires=Wed, 06-Dec-2017 10:57:36 GMT; Domain=.local.com; Path=/

然后在特定用户操作后,应用程序发送以下 API 请求:

curl 'http://127.0.0.1:8000/api/v1.0/tracking?event=video_added&user_id=123123123' -H 'Origin: http://local.com:8080' -H 'Accept: */*' -H 'Referer: http://local.com:8080/' -H 'Connection: keep-alive' --compressed

上述请求的请求头如下所示:

GET api/v1.0/tracking?event=video_added&user_id=123123123 HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Accept: */*
Origin: http://local.com:8080
User-Agent: My user agent
Referer: http://local.com:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

我希望 cookie (random_id_123_123) 与第一个请求一起接收,因为响应标头将是第二个请求的请求标头。

该网站正在运行:http://local.com:8080(实际上在本地机器上运行,我的 vhost 配置指向 127.0.0.1 local.com)并由 python SimpleHTTPServer 提供服务。

设置 cookie 的后端服务也在 localhost 的 8000 端口上运行。 似乎我在实施过程中遗漏了一些东西。那是什么?

编辑:这是code。

【问题讨论】:

如果您不发布任何代码,我们真的很难说 @MatiasCicero 我已经添加了代码链接。 【参考方案1】:

您的问题是 cookie 仅基于域发送。你的代码有

var settings = 
  "crossDomain": true,
  "url": "http://127.0.0.1:8000/api/v1.0/tracking?event=video_added&tracking_id=123123123",
  "method": "GET",


网址是127.0.0.1:8000,如果您希望传递cookie,它应该是local.com:8000

【讨论】:

编辑了问题。设置 cookie 的服务在 127.0.0.1:8000 上运行,调用 API 的网站在 127.0.0.1:8080 上运行。 看到这个线程***.com/questions/1612177/…。如果您在浏览器中以local.com:8080 浏览它,那么api 也应该使用local.com:8000,因为即使local.com 指向127.0.0.1,它们在cookie 共享方面也不相同 另外,如果你愿意,你甚至可以删除 response.cookies["id"]["domain"] = ".local.com",这也应该对你有所帮助。 这是目前网上最好的答案 是的,但是跨源 cookie 呢?我已经尝试了一切都没有运气...更改了 SameSite=None、Secure=true、httonly...等,但我无法发送 cookie。反应/NetCoreApi。【参考方案2】:

上次我检查时,默认情况下 curl 没有启用 cookie。

为此,您需要:

使用参数-b /path/to/cookiejar 来读取cookies。 使用参数-c /path/to/cookiejar 写入cookie。

所以你的请求应该变成:

curl -c cookiejar 'http://127.0.0.1:8000/api/v1.0/tracking' \
-X OPTIONS -H 'Access-Control-Request-Method: POST' \
-H 'Origin: http://local.com:8080' \
-H 'Access-Control-Request-Headers: content-type,x-forwarded-for' \
--compressed

还有:

curl -b cookiejar 'http://127.0.0.1:8000/api/v1.0/tracking?event=video_added&user_id=123123123' \
 -H 'Origin: http://local.com:8080' \
 -H 'Accept: */*' \
 -H 'Referer: http://local.com:8080/' \
 -H 'Connection: keep-alive' --compressed

【讨论】:

以上是关于浏览器未在后续请求中发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章

浏览器未在启用 CORS 的情况下跨域跨域发送 cookie

未在 cookie 中设置令牌

浏览器不为显式域保存 cookie

cookie会话技术

JWT LocalStorage 与 Cookie

服务器获取浏览器发送请求中的cookies,选取自己需要的cookie