2015-04-15 4 views
1

Я развернул API с API-интерфейсом Django REST в локальном режиме. Мое мобильное приложение разработано с использованием Ionic framework (с AngularJS).Django и Angular POST запрос - CSRF не удалось

В моем приложении, когда я хочу, чтобы запросить (метод POST) в Ajax, у меня есть эта ошибка:

CSRF Failed: CSRF token missing or incorrect.

Я не получил эту ошибку, когда я просил в интегрированном проекте Django REST API.

Я исследовал решения в Интернете, но ни один из них не работал.

Информация о проекте:

Джанго файл 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'; 

Просьба предоставить ценные материалы для этого.

+0

я получаю ту же ошибку. Как вы предоставили токен csrf в ионном приложении из django rest api? –

+0

Ответ от @Jakob Runge является самым точным, пожалуйста, обратитесь к этому .... –

ответ

4

Для меня это работает с угловой 1.4:

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

Это работает для меня.

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

Не работает для меня ... Можете ли вы поделиться со мной своим файлом настроек Django, пожалуйста? – tibeoh

+0

'ALLOWED_HOSTS = ['*']' И для этого у меня нет специального промежуточного программного обеспечения. Но я также использую REST Framwork с 'rest_framework.authentication.SessionAuthentication' в 'DEFAULT_AUTHENTICATION_CLASSES'. И я не использую 'CORS_ORIGIN_ALLOW_ALL' и другие настройки' CORS' –

2
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']; 
}) 
0

Вы должны настроить угловой $ HTTP с Джанго {{csrf_token}}.

Добавьте следующий скрипт в свой html после импорта вашего углового приложения и контроллера.

<script> 
    var app = angular.module('my_app'); 

    app.config(['$httpProvider', function($httpProvider) { 
     $httpProvider.defaults.headers.common['X-CSRFToken'] = '{{ csrf_token|escapejs}}'; 
    }]); 
</script> 
Смежные вопросы