В настоящее время я разрабатываю надежную систему 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.
Заранее спасибо.