【问题标题】:cookies not writtent even when I receive set-cookie response header即使我收到 set-cookie 响应标头,cookie 也没有写入
【发布时间】:2017-08-30 16:51:07
【问题描述】:

浏览器正在忽略响应 cookie (csrftoken + seesionid)。 document.cookie()返回空字符串,chrome开发者工具显示this site has no cookies

如何解决?

前: Angular 2 (localhost:4200)

返回: Django/DRF (localhost:8000)

登录路径: [post] /login

响应头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:4200
Allow:POST, OPTIONS
Date:Wed, 05 Apr 2017 07:38:24 GMT
Server:WSGIServer/0.2 CPython/3.5.2
Set-Cookie:sessionid=d5v1mri12bniyvyqqt55ar8mfl9mr2jk; expires=Wed, 19-Apr-2017 07:38:24 GMT; HttpOnly; Max-Age=1209600; Path=/
Set-Cookie:csrftoken=5PcTF8aQ1O79gdrylZcGchnmKyRy6zwS3kL2jR5dY2CMdjPfEYyhkoJjOzsDZuvj; expires=Wed, 04-Apr-2018 07:38:24 GMT; Max-Age=31449600; Path=/
Vary:Accept, Cookie, Origin
X-Frame-Options:SAMEORIGIN

请求头:

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8,fr;q=0.6
Connection:keep-alive
Content-Length:51
content-type:application/json
Cookie:sessionid=d5v1mri12bniyvyqqt55ar8mfl9mr2jk; csrftoken=sml3uocRIeiB3KfHSnNkJXBJn3QAFN3p7lLtdvhrALgUwoVnfNjGM5PIy2L3UHls
Host:127.0.0.1:8000
Origin:http://localhost:4200
Referer:http://localhost:4200/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/56.0.2924.76 Chrome/56.0.2924.76 Safari/537.36

【问题讨论】:

    标签: django angular cookies


    【解决方案1】:

    Cookie 不会在主机的不同端口(在您的情况下为 localhost)之间共享。浏览器显示来自 localhost:4200 的内容,但 cookie 设置为 localhost:8000。它们已正确设置和使用,如您的第二个标题为“请求标头”的清单中所示。因此,要在浏览器中查看它们,您必须从 localhost:8000 打开一个 URL。即使这样 sessionid 也不会在 document.cookie() 中列出,因为它被标记为“HttpOnly”(这意味着 JavaScript 不可用)。

    【讨论】:

    • 对于 seesionid,我需要使用 javascript 访问它(来自:4200)以将其包含在下一个请求标头中,这可能吗?
    • Cookie 会自动包含在请求中,因此您无需在脚本中访问它们。查看您的请求日志 - 其中包含 csrftoken cookie。
    • 我需要这样做才能将 CSRF 令牌添加为请求的标头(而不是 cookie),这就是 csrf 预防的工作原理。标头键称为“X-CSRFToken”,在我的情况下为空,导致 django 回答 403“缺少 csrf 令牌或不正确”
    • 啊,是的,对不起。您无法轻松获取 csrftoken cookie。我能想到的唯一方法可能是打开一个 iframe 并将令牌发送到事件中的应用程序(其父框架)。但是这种方法很容易出错。我认为最好将 CSRF 作为 cookie 发送。见stackoverflow.com/questions/20504846/…
    • 我提到的 iframe 必须从您的后端加载一个页面。该页面将仅包含一个脚本,用于在加载时和令牌更改时发送令牌。
    【解决方案2】:

    如果你使用 angular cli,你可以设置代理。

    ng serve --proxy-config proxy.conf.json

    proxy.conf.json 示例 { "/api": { "target": "http://localhost:3000", "secure": false } }

    或本地开发使用 https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi

    【讨论】:

    • 生产服务器呢?
    • 如果您将托管在与 CORS 相同的域上是没有问题的。如果您使用不同的域,则 cors 将起作用。这是一个 chrome 功能/错误,不允许本地端口上的 CORS
    • extension show an error don't allow wild "*" ....,是 chrome 特有的问题吗?和firefox一样吗? Angular 1 怎么样?我有一个 Angular 1 项目,没有这一切它工作得很好
    • 没用
    猜你喜欢
    • 2011-08-01
    • 2011-12-14
    • 1970-01-01
    • 2018-10-22
    • 2018-11-16
    • 2019-08-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多