使用 Django 和 CORS 的 AngularJS 应用程序中的 cookie 消失了

Posted

技术标签:

【中文标题】使用 Django 和 CORS 的 AngularJS 应用程序中的 cookie 消失了【英文标题】:cookie disappeared in AngularJS app using Django and CORS 【发布时间】:2013-08-17 13:46:10 【问题描述】:

我正在使用 Django Rest Framework 和 Django CORS Headers 作为后端 API 构建一个 AngularJS 应用程序。

直到今天一切正常。突然,csrfcookiesessionid cookie 停止出现在 Chrome 中。

我看到 API 使用 csrfcookie 回复我。 Chrome 没有在开发工具中显示它,但我在 chrome://settings/cookies 中看到它。

AngularJS

$httpProvider.defaults.useXDomain = true;
$http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$http(withCredentials: true, ...)

Django API

CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_HEADERS = (
    'x-requested-with',
    'content-type',
    'accept',
    'origin',
    'authorization',
    'X-CSRFToken'
)

【问题讨论】:

您已经清除了您的 cookie 对吧...?不得不问。 嗨,是的,我清除了所有 cookie,多次。如果我在清除所有 cookie 后刷新浏览器,我会在 chrome://settings/cookies 中再次看到 csrfcookie,但在开发工具中看不到。 AngularJS 无法识别 $cookies 对象中的任何 cookie。 您是否可能不小心在浏览器设置中对 cookie 设置了部分规则?也得问问。 没有。我没有添加任何例外或类似的设置。我完全允许使用 cookie,它们在其他网站上也能正常显示。 【参考方案1】:

好的,所以这个问题的答案很简单,但并不总是很容易注意到,因为 API 和客户端都没有错误消息。

上面的问题是我在浏览器中驻留在 domain.com 上,但我对 API 的请求是 "www.domain.com:8000" . www.domain.comdomain.com 在我的 API 中都是允许的来源。

这里的结论是,如果我居住在 domain.com,那么我需要向 domain.com:8000 发出 API 请求。但如果在我的浏览器中驻留在 www.domain.com 上,那么我需要向 www.domain.com:8000 发出 API 请求。

下面是一个工作示例:

Cookie 现在看起来不错!

我希望这可以帮助任何人,节省几个小时的挫败感:)

更新: 在 Django 设置文件中启用以下设置也将解决问题。使用它们可以让您驻留在浏览器中的不同子域上,并且 cookie 将返回域“.domain.com”

https://docs.djangoproject.com/en/dev/ref/settings/#csrf-cookie-domain https://docs.djangoproject.com/en/dev/ref/settings/#session-cookie-domain

感谢 irc.freenode.net 上的 apollo,#django 提供更新的答案。

【讨论】:

你能用这个例子告诉我吗..我也面临这个错误,, 我的浏览器端 MAMP->192.*.*.*.21:8888/SessionCheck.html , API Server -> 192.*.*.21:8000/api/Login/ 两个 IP地址与差异端口号相同。虽然我使用的是 CORS,但我无法在浏览器存储中设置我的 cookie。我在这里错过了什么

以上是关于使用 Django 和 CORS 的 AngularJS 应用程序中的 cookie 消失了的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CORS 错误“对预检请求的响应未通过访问控制检查”?

不允许使用 Django CORS 方法

使用 Django 和 CORS 的 AngularJS 应用程序中的 cookie 消失了

如何使用 django-cors-headers 让我的 API 正常工作而不会出现 405 错误

Django cors 标头和服务器错误

django、cordova、ionic 和 angular.js 的 CORS 问题