Django CSRF, когда бэкэнд и фронтэнд разделены - PullRequest
13 голосов
/ 10 ноября 2011

После поиска в Интернете люди обычно сталкиваются с этой ситуацией - внешний интерфейс генерируется функцией просмотра django, которая может отправлять пользователю куки-файл токена csrf.Когда у пользователя есть запрос к серверу, использующему ajax, люди могут переписать поведение ajaxSend, которое отправляет csrf на сервер.

Однако моя ситуация такова, что мой интерфейс полностью отделен от сервера, т. Е. Мой интерфейс находится на выделенном сервере под управлением nginx, и у меня есть только один html, предоставляющий все разные страницы.используя hashbang.Мой сервер работает на другом сервере, используя другое доменное имя, и как в этом случае клиент получает файл cookie csrf?Мой бэкэнд только при условии возврата json api.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 31 августа 2018

Этот пост довольно старый, но для людей, которые все еще бродят здесь: Для установок клиент-сервер, таких как собственные настольные и мобильные клиенты (и отдельный интерфейс, как в случае с OP), лучше всего использовать аутентификацию токенов Django Rest Framework. Ссылка

0 голосов
/ 02 апреля 2017

Допустим, у frontend есть домен frontend.example.com и бэкэнд-домен backend.example.com. (Если вы что-то вроде Django, рамки для отдыха) Если вы можете использовать это двумя способами, вы можете включить уровень безопасности, т.е. CSRF Защита или CORS

Для CORS,

pip install django-cors-headers

, а затем настройте его на INSTALLED_APPS, MIDDLEWARE_CLASSES и добавьте домен внешнего интерфейса в CORS_ORIGIN_WHITELIST.

CORS_ORIGIN_WHITELIST = (
    'frontend.example.com'
)

CORS заблокирует любой http-запрос, возникающий из любых доменов, кроме frontend.example.com


Для CSRF,

CSRF_COOKIE_DOMAIN = ".mydomain.com"

и если вы используете Angular App, сделайте, как показано ниже,

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.withCredentials = true;

, а затем добавьте заголовки при выполнении запроса http.

headers : {
    "x-csrftoken" : $cookies.csrftoken
}
0 голосов
/ 02 апреля 2017

Если вы посмотрите на источник токена CRSF: вы увидите, что все csrf_middleware проверяет cookie по значению post. Вам просто нужно вернуть значение post на ваш сервер, так как cookieдолжен быть уже установлен через AJAX. Если вы посмотрите на источник тега шаблона, то увидите, что он просто выводит переменную из контекста. Либо вставьте ее в свой ответ, вытянув ее из контекста, если она доступна, либо вызов контекстного процессора напрямую. Теперь вам просто нужно отправить его обратно как переменную POST crsf_token.

...