2015-09-13 11 views
1

Я пытаюсь воссоздать небольшой проект из легкого Джанго - https://github.com/lightweightdjango/examples/tree/chapter-5CSRF проверка неудача в Джанго/Backbone.js

Я получаю ошибку CSRF при попытке войти в системе с учетной записью суперпользователя. Ниже приведены мои модели.js

(function ($, Backbone, _, app) { 

    // CSRF helper functions taken directly from Django docs 
    function csrfSafeMethod(method) { 
     // these HTTP methods do not require CSRF protection 
     return (/^(GET|HEAD|OPTIONS|TRACE)$/i.test(method)); 
    } 

    function getCookie(name) { 
     var cookieValue = null; 
     if (document.cookie && document.cookie != '') { 
      var cookies = document.cookie.split(';'); 
      for (var i = 0; i < cookies.length; i++) { 
       var cookie = $.trim(cookies[i]); 
       // Does this cookie string begin with the name we want? 
       if (cookie.substring(0, name.length + 1) == (name + '=')) { 
        cookieValue = decodeURIComponent(
        cookie.substring(name.length + 1)); 
        break; 
       } 
      } 
     } 
     return cookieValue; 
    } 

    // Setup jQuery ajax calls to handle CSRF 
    $.ajaxPrefilter(function (settings, originalOptions, xhr) { 
     var csrftoken; 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      // Send the token to same-origin, relative URLs only. 
      // Send the token only if the method warrants CSRF protection 
      // Using the CSRFToken value acquired earlier 
      csrftoken = getCookie('csrftoken'); 
      xhr.setRequestHeader('X-CSRFToken', csrftoken); 
     } 
    }); 

Я пробовал клонировать весь проект в свою локальную папку. Я все еще получаю ошибку CSRF.

Django просто предоставляет API для проекта - шаблонирования и т.д. обрабатывается Backbone.js

Пожалуйста, дайте мне знать, если я должен отправить больше кода.

мой шаблон Войти, если это какой-либо помощи

var LoginView = FormView.extend({ 
     id: 'login', 
     templateName: '#login-template', 
     submit: function (event) { 
      var data = {}; 
      FormView.prototype.submit.apply(this, arguments); 
      data = this.serializeForm(this.form); 
      $.post(app.apiLogin, data) 
       .done($.proxy(this.loginSuccess, this)) 
       .fail($.proxy(this.failure, this)); 
     }, 
     loginSuccess: function (data) { 
      app.session.save(data.token); 
      this.done(); 
     } 
    }); 
+0

ли вам на самом деле есть заголовок 'X-CSRFToken' с запросом на вход? –

ответ

0

Это не ясно из примера кода, если вы определяете маркер CRSF. Если вы используете шаблоны django, вы можете установить {% csrf_token %} как ваш токен CRSF, где-то в вашем коде.

0

У меня была точно такая же проблема. Затем, как указано на странице 111 книги:

Предполагается, что в проекте используется имя файла cookie по умолчанию csrftoken. При необходимости этот токен можно настроить через конфигурацию, обработанную app.js.

Я добавил "csrftoken": "{% csrf_token %}" в разделе «Конфигурация» в index.html:.

... 
<script src="{% static 'board/vendor/backbone.js' %}"></script> 
<script id="config" type="text/json"> 
    { 
     "models": {}, 
     "collections": {}, 
     "views": {}, 
     "router": null, 
     "csrftoken": "{% csrf_token %}", //added this 
     "apiRoot": "{% url 'api-root' %}", 
     "apiLogin": "{% url 'api-token' %}" 
    } 
</script> 
<script src="{% static 'board/js/app.js' %}"></script> 
... 

С этим изменением, ошибка была исправлена, и я смог войти в

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