Прежде всего, я начинающий разработчик.Я прошу прощения за возможные заблуждения.
Я пытаюсь создать приложение Reactjs, которое связывается с отделенным внутренним интерфейсом Drupal 8 с помощью fetchAPI.
Я хочу создать систему аутентификации, используя сеансовые куки.Получение cookie с сайта Drupal и установка его в браузере работает нормально.Я могу включить куки в HTTP-запросах.Однако, в дополнение к cookie, Drupal также хочет, чтобы в заголовок HTTP-запроса был включен «x-csrf-token».Этот токен можно получить с помощью HTTP-запроса GET к сайту Drupal.Поэтому, когда пользователь входит в систему, я запрашиваю как cookie, так и x-csrf-token и сохраняю токен в состоянии приложения React, используя Redux.
Теперь, когда я пытаюсь выполнить запрос POST, я получаю токен из хранилища Redux и включаю его в HTTP-запрос, используя заголовок X-CSRF-Token.Это дает мне ошибку 403 со следующим ответом: «Заголовок запроса X-CSRF-Token недействителен».Точно такой же запрос в сочетании с получением cookie и токена отлично работает в почтальоне, поэтому я не знаю, почему я получаю эту ошибку в браузере.
Я пробовал несколько браузеров и разные форматы для токена, но все еще не могу заставить это работать.
(Примечание: я использую веб-сервисы RESTful из ядра Drupal с включенной аутентификацией cookie).
Получение токена X-CSRF:
export function getCsrfToken() {
return function(dispatch) {
fetch("http://drupalsite.local/rest/session/token", {
method: "GET"
})
.then(res => res.text())
.catch(err => {
console.log(err)
})
.then(token => {
console.log(token);
dispatch({
type: FETCH_CSRF_TOKEN,
payload: token
});
})
.catch(err => {
console.log(err);
});
};
}
Запрос POST:
export function post(name, csrfToken) {
const data = JSON.stringify({
title: [
{
value: name
}
],
type: [
{
target_id: "test"
}
]
});
return function(dispatch) {
fetch("http://drupalsite.local/node", {
method: "POST",
credentials: "include",
headers: new Headers({
"Content-Type": "application/json",
Accept: "application/json",
"X-CSRF-TOKEN": csrfToken
}),
body: data
})
.then(res => {
dispatch({
type: POST_DATA_CORE_REST,
payload: res
});
})
.catch(err => {
console.log(err);
});
};
}
HTTP-заголовки