使用 AngularJs 发布请求时未设置 CSRF Cookie - Django 后端
CSRF Cookie not set when posting request with AngularJs - Django Backend
我正在使用 angularjs 和 django 构建一个网络应用程序,我正在通过 Ajax 请求提交表单。
我的问题是,当使用 angular(准确地说是 ng-file-upload)发布 Ajxa 请求时,未设置 django 期望的 csrfmiddlewaretoken。
根据我在 angular 文档和其他论坛上的讲座,我得到了以下配置。
在angular的配置部分:
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.withCredentials = true;
在我的控制器中发送请求的代码是:
Upload.upload({
url: 'http://localhost:8000/image',
headers: {
'X-CSRFToken': $cookies['csrftoken']
},
data: {file: file}
})
使用该代码发送的请求具有以下 headers :
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,de;q=0.2,fi;q=0.2
Connection:keep-alive
Content-Length:16582
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarybWo821vSwcejTATP
Cookie:csrftoken=bC2UpXurGXAg3AUZgSqMVlUs8TKfussS
Host:localhost:8000
Origin:http://127.0.0.1:8000
Referer:http://127.0.0.1:8000/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36
X-CSRFToken:UeSt4LoqgU9L28JQBdVbS2IJJXOMQK6n
然而,为了使 django 能够正确处理 csrf 保护,缺少以下 header
Cookie:_ga=GA1.1.1358238168.1447425523; XSRF-TOKEN=zWIM6q7O2Nz3PLm8TMUJSLFVRF8bKUbr; csrftoken=UeSt4LoqgU9L28JQBdVbS2IJJXOMQK6n
到目前为止,尽管看到了很多关于这个主题的论坛,但我还是没能设置这个 header。如果我尝试通过以下方式以编程方式设置它:
Upload.upload({
url: 'http://localhost:8000/image',
headers: {
'Cookie': 'csrftoken='+$cookies['csrftoken']
},
data: {file: file}
})
我的控制台出现以下错误:
Refused to set unsafe header "Cookie"
我的问题实际上是如何从客户端配置 cookie header。我的 django 代码没问题。
我已经为此苦苦挣扎了一段时间。任何帮助,将不胜感激 !谢谢
如果您将 csrftoken 添加到客户端 headers:{'X-CSRFToken': $cookies['csrftoken']}
意味着您的客户端很可能已准备就绪,但出于安全考虑,如果您从外部应用程序与 django api 交互他仍然会阻止返回 unsafe header "Cookie" 的请求。
尝试以下配置以允许跨站点请求通过您的应用程序:
pip install django-cors-headers
然后将其添加到 settings.py:
中已安装的应用程序
INSTALLED_APPS = (
...
'corsheaders',
...
)
您还需要添加一个中间件 class 来监听响应并确保遵守以下顺序:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
最后添加这个设置变量:
CORS_ORIGIN_ALLOW_ALL = True
这应该足够了,但对于更多自定义配置,您可以查看 django-cors-headers
我正在使用 angularjs 和 django 构建一个网络应用程序,我正在通过 Ajax 请求提交表单。
我的问题是,当使用 angular(准确地说是 ng-file-upload)发布 Ajxa 请求时,未设置 django 期望的 csrfmiddlewaretoken。
根据我在 angular 文档和其他论坛上的讲座,我得到了以下配置。
在angular的配置部分:
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.withCredentials = true;
在我的控制器中发送请求的代码是:
Upload.upload({
url: 'http://localhost:8000/image',
headers: {
'X-CSRFToken': $cookies['csrftoken']
},
data: {file: file}
})
使用该代码发送的请求具有以下 headers :
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,de;q=0.2,fi;q=0.2
Connection:keep-alive
Content-Length:16582
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarybWo821vSwcejTATP
Cookie:csrftoken=bC2UpXurGXAg3AUZgSqMVlUs8TKfussS
Host:localhost:8000
Origin:http://127.0.0.1:8000
Referer:http://127.0.0.1:8000/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36
X-CSRFToken:UeSt4LoqgU9L28JQBdVbS2IJJXOMQK6n
然而,为了使 django 能够正确处理 csrf 保护,缺少以下 header
Cookie:_ga=GA1.1.1358238168.1447425523; XSRF-TOKEN=zWIM6q7O2Nz3PLm8TMUJSLFVRF8bKUbr; csrftoken=UeSt4LoqgU9L28JQBdVbS2IJJXOMQK6n
到目前为止,尽管看到了很多关于这个主题的论坛,但我还是没能设置这个 header。如果我尝试通过以下方式以编程方式设置它:
Upload.upload({
url: 'http://localhost:8000/image',
headers: {
'Cookie': 'csrftoken='+$cookies['csrftoken']
},
data: {file: file}
})
我的控制台出现以下错误:
Refused to set unsafe header "Cookie"
我的问题实际上是如何从客户端配置 cookie header。我的 django 代码没问题。
我已经为此苦苦挣扎了一段时间。任何帮助,将不胜感激 !谢谢
如果您将 csrftoken 添加到客户端 headers:{'X-CSRFToken': $cookies['csrftoken']}
意味着您的客户端很可能已准备就绪,但出于安全考虑,如果您从外部应用程序与 django api 交互他仍然会阻止返回 unsafe header "Cookie" 的请求。
尝试以下配置以允许跨站点请求通过您的应用程序:
pip install django-cors-headers
然后将其添加到 settings.py:
中已安装的应用程序INSTALLED_APPS = (
...
'corsheaders',
...
)
您还需要添加一个中间件 class 来监听响应并确保遵守以下顺序:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
最后添加这个设置变量:
CORS_ORIGIN_ALLOW_ALL = True
这应该足够了,但对于更多自定义配置,您可以查看 django-cors-headers