При отправке 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 загвоздка. Если нужна какая то дополнительная информация, покажу код. Потому что уже весь мануал вдоль и поперек прочитал и перепроверил. Не хочет принимать куку и все..


Ответы (0 шт):