2

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

直到今天一切正常。突然csrfcookieandsessionid 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'
)
4

1 回答 1

1

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

在此处输入图像描述

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

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

下面是一个工作示例:

在此处输入图像描述

饼干现在看起来很好!

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

更新: 在 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 提供了更新的答案。

于 2013-08-19T11:07:10.170 回答