使用 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 应用程序。
直到今天一切正常。突然,csrfcookie
和 sessionid 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.com 和 domain.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 的 AngularJS 应用程序中的 cookie 消失了