При отправке POST запроса из SPA Laravel возвращает 419, несмотря на то что CSRF-токен был передан
Логика отправки запроса в SPA у меня следующая.
Вначале я вызываю экспортированную из файла функцию (пример ниже).
Эта функция в свою очередь вызывает makeRequest. Если в ответе приходит 419 статус, то я выполняю запрос на 'api/csrf-cookie', в случае успеха повторяю первоначальный запрос.
В общем на этом этапе все хорошо. Выполняется 3 запроса (первый с ошибкой CSRF, второй на получение токена, и снова первый)
const makeRequest = async (url, options = {}) => {
const {data, error} = await useFetch(url, {
baseURL: '/api',
headers: {
Accept: "application/json"
},
...options,
});
return {
data: data._rawValue ?? error._rawValue,
status: !error?._rawValue
}
}
export default defineNuxtPlugin(nuxtApp => {
return {
provide: {
api: async (url, options) => {
const res = await makeRequest(url, options); //Выполняю первый запрос
if (!res.status && res.data.response?.status === 419) {
// В случае ошибки CSRF отправляю запрос на получение токена
const res = await makeRequest('csrf-cookie');
if (!res.status) return res;
// Если CSRF получен, выполняю первоначальный запрос.
return await makeRequest(url, options);
}
return res;
}
}
}
})
Сами запросы в браузере выглядят вот так. Первый запрос со статусом 419. Видно что CSRF кука не отправлена.
Второй запрос на получение куки вернулся со статусом 204.
Как видим, в запросе уже есть CSRF токен, но ответ все равно 419.
Я проверил то же самое с авторизаций пользователя и там прекрасно аутентифицирует. (попытался получить доступ к закрытым роутам, получил) То есть авторизационная кука принимается и меня пускает.
А что с CSRF не так не могу понять...
Laravel 9, получение CSRF сделано по алгоритму описанному тут https://laravel.com/docs/9.x/sanctum
серверная часть сайта находится на отдельном домене, а в SPA у меня настроено проксирование
vite: {
server: {
proxy: {
"/api": {
target: 'https://app-local.ru',
secure: false,
},
},
},
},
может быть токен не принимает потому что запросы идут без https.. тогда наверное надо как то отключить, чтобы система принимала CSRF и с https и без.
Но почему тогда авторизация проходит успешно, и после обновления страницы авторизация не слетает, непонятно. В общем только с этип CSRF загвоздка. Если нужна какая то дополнительная информация, покажу код. Потому что уже весь мануал вдоль и поперек прочитал и перепроверил. Не хочет принимать куку и все..

