首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django和角后请求- CSRF失败

Django和角后请求- CSRF失败
EN

Stack Overflow用户
提问于 2015-04-15 13:38:42
回答 4查看 2.7K关注 0票数 1

我已经用Django REST框架在本地部署了一个API。我的移动应用程序是用Ionic框架(用AngularJS)开发的。

在我的应用程序中,当我想用Ajax请求(POST方法)时,我有以下错误:

CSRF失败: CSRF令牌丢失或不正确。

当我在Django REST集成项目中请求时,我没有收到这个错误。

我研究了网络上的解决方案,但都没有奏效。

项目信息:

Django文件settings.py

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
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

在我的应用程序中,我试图添加这个解决方案,但是它没有工作:

代码语言:javascript
运行
复制
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';

请为此提供宝贵的投入。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-08 21:12:50

对我来说,这适用于角1.4:

代码语言:javascript
运行
复制
var myApp = angular.module('myApp', []).config(function($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'
});
票数 5
EN

Stack Overflow用户

发布于 2015-04-15 15:21:28

代码语言:javascript
运行
复制
    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'];
})
票数 3
EN

Stack Overflow用户

发布于 2015-04-15 13:47:16

这对我有用。

代码语言:javascript
运行
复制
.run( function run($http, $cookies){
     // For CSRF token compatibility with Django
     $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29651779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档