【问题标题】:Django and Angular POST request - CSRF failedDjango 和 Angular POST 请求 - CSRF 失败
【发布时间】:2015-06-21 12:08:01
【问题描述】:

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

在我的应用程序中,当我想在 Ajax 中请求(POST 方法)时,出现此错误:

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

我在 Django REST API 集成项目中请求时没有收到此错误。

我在网上研究了解决方案,但没有一个奏效。

项目信息:

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';

请为此提供有价值的意见。

【问题讨论】:

  • 我遇到了同样的错误。您是如何从 django rest api 在 ionic 应用程序中提供 csrf 令牌的?
  • @Jakob Runge 的回答是最准确的,请参考......

标签: python django angularjs csrf django-csrf


【解决方案1】:

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

var myApp = angular.module('myApp', []).config(function($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'
});

【讨论】:

    【解决方案2】:

    您需要使用 django {{csrf_token}} 配置您的角度 $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>
    

    【讨论】:

      【解决方案3】:
          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'];
      })
      

      【讨论】:

        【解决方案4】:

        这对我有用。

        .run( function run($http, $cookies){
             // For CSRF token compatibility with Django
             $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
        });
        

        【讨论】:

        • 不适合我...你能和我分享你的 Django settings.py 文件吗?
        • ALLOWED_HOSTS = ['*'] 我没有为此定制的中间件。但我也在“DEFAULT_AUTHENTICATION_CLASSES”中使用带有rest_framework.authentication.SessionAuthentication 的REST 框架。而且我不使用CORS_ORIGIN_ALLOW_ALL 和其他CORS 设置
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 2013-02-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 2015-03-08
        相关资源
        最近更新 更多