Django 和 Angular POST 请求 - CSRF 失败
Django and Angular POST request - CSRF failed
我已经在本地部署了一个 API 和 Django REST API Framework。
我的移动应用程序是使用 Ionic 框架开发的(AngularJS)。
在我的应用程序中,当我想在 Ajax 中请求(POST 方法)时,出现此错误:
CSRF Failed: CSRF token missing or incorrect.
我在Django REST API集成项目中请求时没有收到这个错误。
我在网上搜索了解决方案,但 none 有效。
项目信息:
Django 文件 settings.py:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'klipix.django-crossdomainxhr-middleware.OrganizationMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
我使用了 TokenAuthentication 方法 (http://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication)。我的 django-crossdomainxhr-middleware.py 文件:
class OrganizationMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
header_token = request.META.get('HTTP_AUTHORIZATION', None)
if header_token is not None:
try:
token = sub('Token ', '', request.META.get('HTTP_AUTHORIZATION', None))
token_obj = Token.objects.get(key = token)
request.user = token_obj.user
except Token.DoesNotExist:
pass
在我的应用程序中,我尝试添加此解决方案,但没有成功:
angular.module('starter', ['ionic'])
.run(function($rootScope, $ionicPlatform, $http) {
$http.defaults.xsrfHeaderName = 'X-CSRFToken';
$http.defaults.xsrfCookieName = 'csrftoken';
.config(function($stateProvider, $urlRouterProvider, $httpProvider) {
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
请为此提供宝贵意见。
这对我有用。
.run( function run($http, $cookies){
// For CSRF token compatibility with Django
$http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
});
angular.module('starter', ['ngCookies'])
.config(function ($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
})
.run( function run( $http, $cookies ){
$http.defaults.headers.post['X-CSRFToken'] = $cookies['csrftoken'];
})
您需要使用 django {{csrf_token}} 配置您的 angular $http。
在您的 angular 应用程序和控制器导入后,将以下脚本添加到您的 html 中。
<script>
var app = angular.module('my_app');
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.headers.common['X-CSRFToken'] = '{{ csrf_token|escapejs}}';
}]);
</script>
对我来说这适用于 angular 1.4:
var myApp = angular.module('myApp', []).config(function($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken'
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'
});
我已经在本地部署了一个 API 和 Django REST API Framework。 我的移动应用程序是使用 Ionic 框架开发的(AngularJS)。
在我的应用程序中,当我想在 Ajax 中请求(POST 方法)时,出现此错误:
CSRF Failed: CSRF token missing or incorrect.
我在Django REST API集成项目中请求时没有收到这个错误。
我在网上搜索了解决方案,但 none 有效。
项目信息:
Django 文件 settings.py:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'klipix.django-crossdomainxhr-middleware.OrganizationMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
我使用了 TokenAuthentication 方法 (http://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication)。我的 django-crossdomainxhr-middleware.py 文件:
class OrganizationMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
header_token = request.META.get('HTTP_AUTHORIZATION', None)
if header_token is not None:
try:
token = sub('Token ', '', request.META.get('HTTP_AUTHORIZATION', None))
token_obj = Token.objects.get(key = token)
request.user = token_obj.user
except Token.DoesNotExist:
pass
在我的应用程序中,我尝试添加此解决方案,但没有成功:
angular.module('starter', ['ionic'])
.run(function($rootScope, $ionicPlatform, $http) {
$http.defaults.xsrfHeaderName = 'X-CSRFToken';
$http.defaults.xsrfCookieName = 'csrftoken';
.config(function($stateProvider, $urlRouterProvider, $httpProvider) {
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
请为此提供宝贵意见。
这对我有用。
.run( function run($http, $cookies){
// For CSRF token compatibility with Django
$http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
});
angular.module('starter', ['ngCookies'])
.config(function ($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
})
.run( function run( $http, $cookies ){
$http.defaults.headers.post['X-CSRFToken'] = $cookies['csrftoken'];
})
您需要使用 django {{csrf_token}} 配置您的 angular $http。
在您的 angular 应用程序和控制器导入后,将以下脚本添加到您的 html 中。
<script>
var app = angular.module('my_app');
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.headers.common['X-CSRFToken'] = '{{ csrf_token|escapejs}}';
}]);
</script>
对我来说这适用于 angular 1.4:
var myApp = angular.module('myApp', []).config(function($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken'
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'
});