2016-02-01 7 views
1

Иногда я не могу войти в свою заявку.Проверка подлинности Django: CSRF Failed

Проверка подлинности осуществляется с помощью API Django.

Но иногда она возвращает ошибку 403 с этим значением в результирующем объекте:

responseText: "{"detail":"CSRF Failed: CSRF token missing or incorrect."}" 

И все же в моем приложении, у меня есть:

angular.module('app') 
    .config(function(ezLayoutProvider, $httpProvider) { 
    ezLayoutProvider.register(layoutName, {templateUrl: './main.html'}); 
    ezLayoutProvider.setDefault(layoutName); 
    var getCookie = function(cookieName) { 
     var cookieValue = null; 

    if (document.cookie && document.cookie !== '') { 
    var cookies = document.cookie.split(';'); 
    for (var i = 0; i < cookies.length; i++) { 
     var cookie = cookies[i].trim(); 
     if (cookie.substring(0, cookieName.length + 1) === (cookieName + '=')) { 
     cookieValue = decodeURIComponent(cookie.substring(cookieName.length + 1)); 
     break; 
     } 
    } 
    } 
    return cookieValue; 
}; 

$httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 
$httpProvider.defaults.headers.common['X-CSRFToken'] = getCookie('csrftoken'); 
console.log($httpProvider.defaults.headers.common); 
}) 

И консолей показывает маркер правильно перед тем, как попытаться войти в систему.

Странно то, что, как только я очищу свои файлы cookie и кеш из браузера, он работает.

Так что я предполагаю, что это как-то связано с сессией Джанго?

Вот кусок моего settings.py:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.TokenAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.DjangoModelPermissions', 
    ), 
} 

REST_PROXY = { 
    'HOST': 'http://localhost:5000' 
} 

CORS_ORIGIN_ALLOW_ALL = True 

AUTHENTICATION_BACKENDS = (
    'auth.ldap.LDAPBackendFR', 
    'auth.ldap.LDAPBackendUS', 
    'auth.ldap.LDAPBackendHK', 
    'auth.ldap.LDAPBackendIN', 
    'django.contrib.auth.backends.ModelBackend', 
) 

Другой странный момент, является то, что он, кажется, работает также с:

Object {Accept: "application/json, text/plain, */*", X-Requested-With: "XMLHttpRequest", X-CSRFToken: null} 

$httpProvider.defaults.headers.common как.

ответ

2

Почему вы используете $httpProvider.defaults.headers.common['X-CSRFToken'] = getCookie('csrftoken');? Я не специалист по AngularJS, но эта строка не нужна.

Это то, что Django documentation говорит:

Если вы используете AngularJS 1.1.3 и новее, это достаточно, чтобы настроить $http провайдера с именами печенья и заголовочных:

$http.defaults.xsrfCookieName = 'csrftoken'; 
$http.defaults.xsrfHeaderName = 'X-CSRFToken'; 

С моей точки зрения, вот как выглядит ваш код:

$httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 
/* Not needed, causes harm! */ 
/* $httpProvider.defaults.headers.common['X-CSRFToken'] = getCookie('csrftoken'); */ 
console.log($httpProvider.defaults.headers.common); 

Это также должно объяснить, почему работает X-CSRFToken: null.

+0

Я просто заметил, что это произошло, когда я также был зарегистрирован в интерфейсе администратора, поэтому я предполагаю, что один toke приходит, удаляет другой токен. Таким образом, он работает, однако, если я также вошел в систему администратора, я не могу выйти из приложения. – Ellone

0

Если я не ошибаюсь, у CSRF Django есть временные рамки, где они работают.

Время от времени у меня есть эта проблема и освежающая форма, и поэтому CSRF работает для меня.

+0

Это не для меня, пользователю обычно необходимо очистить свои файлы cookie, чтобы иметь возможность входа в систему, когда это происходит. Я думаю, что это, вероятно, связано с обработкой сеанса в Django. – Ellone

+0

Очистка файла cookie также очищает токен csrf, поэтому вы используете getCookie ('csrftoken') – Linovia

Смежные вопросы