Парсинг Django CSRF-токена из заголовков ответа - PullRequest
0 голосов
/ 13 января 2020

Во-первых, я знаю, что есть много вопросов относительно токенов CSRF / Django, но я не нашел ни одного, который был бы полезен для сценария, в котором я нахожусь.

Я пытаюсь использовать Django Встроенные конечные точки сброса пароля с интерфейсом React. Моя цель - использовать бэкэнд-функциональность (создание токенов, ответов по электронной почте и т. Д. c) при отображении соответствующих форм через React вместо использования шаблонов Django. Внешний и внутренний интерфейсы размещены на двух уникальных серверах.

В своем коде внешнего интерфейса я вызываю конечную точку password_reset, когда мой компонент React монтируется для получения токена CSRF.

    componentDidMount() {
        let url = "http://(raw ip address)/accounts/password_reset/"

        fetch(url, {
            credentials: 'include',
        })
    }

Токен в заголовках ответа получен как

Set-Cookie: csrftoken=b...e; expires=Sun, 10 Jan 2021 21:50:20 GMT; Max-Age=31449600; Path=/; SameSite=Lax

Здесь начинаются мои проблемы - я не могу проверить токен в своем хранилище tab и значение токена отсутствуют в document.cookie. В идеале я хотел бы использовать что-то вроде getCookie метода, продемонстрированного в Django документах

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 = cookies[i].trim();
            // 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;
}

Но это предполагает, что значение токена правильно хранится в document.cookie.

Все мои соответствующие настройки Django являются значениями по умолчанию, хотя я перебрал допустимые значения для CSRF_COOKIE_SAMESITE и CSRF_USE_SESSIONS безрезультатно.

В качестве еще одного примечания, если я сделаю запрос POST после монтирования компонента, токен будет успешно установлен в запросе - но мне нужно добавить токен в теле для аутентификации по умолчанию Django просмотров!

Любые предложения или идеи будут с благодарностью!

Ян

1 Ответ

0 голосов
/ 13 января 2020

Согласно Django документам, если ваше представление не отображает шаблон html с тегом csrf_token, что, как я полагаю, соответствует вашему случаю, поскольку вы не используете встроенный шаблон Django для вывода, повар ie не будет установлено. Одним из возможных решений этой проблемы было бы заключить вызов view в sure_csrf_token decorator в ваших urlpatterns.

...