CakePHP3 ~ Несовпадение CSRF-токена во второй функции - PullRequest
0 голосов
/ 26 марта 2020

В настоящее время я разрабатываю надежную систему JavaScript, которая работает с инфраструктурой Cake PHP 3 в качестве серверной части. Все действия в моей панели выполняются на одной странице / URL, это одностраничное приложение. В настоящее время у меня работает куча функций, и я решил, что пришло время исследовать CSRF-компонент Cake PHP 3. Когда я включил его, я получил ошибку 400, которая указала, что токен CSRF не был предоставлен. После долгих исследований я пришел к решению, что это исправлено с помощью FormMaker или с помощью ручной реализации токена в моем запросе JQuery ajax. Это сработало, поэтому я решил также реализовать следующую функцию. Но, как вы можете догадаться, это не сработало. Второй запрос ajax дает несоответствие CSRF-токена. Пожалуйста, посмотрите на мой код ниже:

Мой первый запрос, который действительно работает:

function getSectionData(controller, method = null) {
    fetch("<?=$this->Url->build(['controller' => '']);?>" + "/" + controller + "/getSectionData", {
            method: 'POST',
            headers: {
                "Content-Type": "application/json",
                "X-CSRF-Token": <?= json_encode($this->request->param('_csrfToken')); ?>
            },
            body: JSON.stringify({
                method: method
            })
        })
            .then((res) =>
                res.json())
            .then((data) => {
                console.warn(data);
                let response = data.response;

                if (response.success == 1) {
                    // Action to do when data has been received
                    let method = response.method;
                    let rows = response.rows;

                    window[method](controller, rows);
                } else if (response.success == 0) {
                    // Message when an error occures

                }

            })
            .catch((err) => console.log(err))
}

В конечном итоге вторая функция активируется менее чем через секунду:

function renderElement(element, id, data = null) {
    let path = "<?= $this->request->here; ?>" + "/renderElement/" + element;
    $('#' + id).load(path, {
        data: data, 
        headers: {
            "X-CSRF-Token": <?= json_encode($this->request->param('_csrfToken')); ?>
        }
    });
}

В этой функции я загружаю предустановленный элемент HTML из другого файла, который может содержать элементы данных, поэтому он сначала запрашивает данные у контроллера. Я использую те же заголовки, что и в первой функции, и CSRF-токен присутствует в консоли. Но это не работает и выдает ошибку несоответствия. Я хотел бы знать, почему он дает эту ошибку и как я могу ее решить, например, нужно ли мне обновить sh и как?

Обратите внимание, что я использую версию Cake PHP 3 до обновления 3.6, в котором был удален компонент CSRF и добавлено промежуточное программное обеспечение CRSF.

Заранее спасибо.

1 Ответ

0 голосов
/ 26 марта 2020

Функция jQuery.load() не принимает параметры конфигурации AJAX, вторым аргументом является либо обратный вызов, либо объект, который определяет данные POST для отправки вместе с запросом.

Вы либо необходимо переключиться на использование настраиваемого запроса AJAX (например, как в первом фрагменте) или глобально настроить jQuery, чтобы установить требуемый заголовок для всех запросов AJAX:

$.ajaxSetup({
    headers: {
        'X-CSRF-Token': <?= json_encode($this->request->param('_csrfToken')); ?>
    }
});

См. также

...