浏览器未在后续请求中发送 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的主要内容,如果未能解决你的问题,请参考以下文章