как сделать проекты на стороне сервера django и углового клиента разными с защитой CSRF

Я читал разные блоги о django и angular, но все они имеют коды на стороне клиента (HTML+CSS+JS) внутри проекта django.

Все, что я хочу сделать, это создать два проекта: один со всем клиентским стеком (HTML+JS+CSS), а другой только с Django и Django-rest-framework. Это означает, что я мог бы написать весь код презентации в другом проекте и код сервера в другом проекте, но связать их вместе с помощью API REST.

Но возникает угроза, которую я всегда должен учитывать CSRF, против которой промежуточное ПО Django CSRF обеспечивает хорошую защиту.
Итак, возможно ли поместить мои клиентские коды вне каталога проекта Django, но при этом защититься от CSRF?


person surenyonjan    schedule 16.12.2014    source источник


Ответы (1)


Читайте документацию, там все хорошо описано. Самый простой способ сделать это — когда вы отправляете свои данные с помощью Ajax, вам нужно добавить собственный заголовок X-CSRFToken. Токен можно разобрать из файлов cookie, которые, кстати, должны быть включены. Вот ссылка на документацию.

Документация всегда является лучшим местом для поиска ваших вопросов, вам просто нужно прочитать приятель. Но тем не менее, вот пример:

// Using the jquery cookie plugin, you can get the csrf token like this 
var csrftoken = $.cookie('csrftoken');

Затем в вашем коде javascript/Anuglar, чтобы опубликовать или сделать запрос ajax, вы должны добавить заголовок X-CSRFToken перед выполнением запроса POST/PUT:

// This HTTP method doesn't need protection since you will be reading and not pushing data
//   into the server
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

// This is for setting up the upcoming ajax request, here you add the header with the
//   csrftoken you got it from the cookies
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

Примечание: здесь используется jQuery, вы можете сделать то же самое с помощью Angular.

После этого вы можете сделать свой вызов Ajax, и Django с радостью примет ваш запрос, еще раз RTD, пожалуйста, все хорошо объяснено, у вас есть все эти примеры кода.

person e-nouri    schedule 16.12.2014
comment
Как и в документации, мы должны сначала получить токен CSRF. В django мы помещаем {% csrf_token %} в файл шаблона. Но я хочу, чтобы мои angularjs были полностью разделены, то есть не отображались веб-фреймворком django, которым этот токен не будет заменен. Таким образом, без размещения кода {% csrf_token %} можно защитить с помощью промежуточного программного обеспечения csrf - person surenyonjan; 17.12.2014
comment
Вам не нужно этого делать, так как csrf_token передается через файлы cookie, и вы можете получить к нему доступ через код javascript/Angular.js. - person e-nouri; 18.12.2014
comment
Ну вот, но, пожалуйста, прочитайте документ, вы найдете там больше информации, ура. - person e-nouri; 19.12.2014