Laravel Sanctum и React с Axios, возврат POST 419

Я был очень отчаянным в течение этих нескольких дней, потому что я, кажется, не могу решить эту одну простую проблему.

Я не могу аутентифицировать свой SPA (реагировать через Axios) на базе Sanctum Laravel

Я прочитал документацию и прочитал учебные пособия и вопросы. Некоторые проблемы я преодолел.

В итоге остановился на этом:

Мой запрос содержал X-CSRF-TOKEN, но он всегда возвращает сообщение 419: несоответствие токена CSRF.

Вот скриншот моей сетевой страницы:

введите здесь описание изображения введите здесь описание изображения

Как видно, запрос на вход в систему отправил токен CSRF. На второй картинке вкладка cookie того же запроса.

Но в итоге вернул 419

Я сейчас в растерянности, что делать

Пожалуйста помоги

Большое спасибо

P.S. Поскольку я в настоящее время потерян, я не знаю, какую часть моего кода мне следует прикрепить, поэтому, чтобы уберечь вас от чтения большого количества бесполезных частей кода, я не разместил их все в своем первоначальном вопросе, а все это означает, пожалуйста, запросите, какую часть кода я должен прикрепить, чтобы уточнить мою проблему

Вложение:

.env Laravel

SESSION_DRIVER=cookie
SESSION_LIFETIME=120
SESSION_SECURE_COOKIE=false
SESSION_DOMAIN=.localhost
SANCTUM_STATEFUL_DOMAINS=localhost:3000,localhost:8000,127.0.0.1:3000,127.0.0.1:8000

Моя реагирующая функция axios

export const sendLogin = (data) => {
    axios.defaults.withCredentials = true;
    const response = axios.get(apiUrl('sanctum/csrf-cookie','backend-non-api-route')).then(response => {
        return axios.post(apiUrl('user/login','backend-non-api-route'),data,{ 
            xsrfHeaderName: 'X-CSRF-Token',
            withCredentials: true
          });
    })
    return response;
}

примечание: функция apiUrl() просто добавляет URL-адрес Laravel

приложение/http/Kernel.php

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\HandleInertiaRequests::class,
        ],

        'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            //\Illuminate\Session\Middleware\StartSession::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];
}

person Gita Prasetya Adiguna    schedule 09.07.2021    source источник
comment
убедитесь, что вы добавили свои маршруты laravel в файл api   -  person Joseph    schedule 09.07.2021
comment
@Джозеф, да, у меня есть маршрут «пользователь/логин» в моем маршруте /api.php, а также в маршруте /web.php. Хотя реагирующий пост Axios отправляется на [веб-маршрут]   -  person Gita Prasetya Adiguna    schedule 09.07.2021
comment
Не могли бы вы поделиться с нами своим app/Http/Kernel.php файлом?   -  person DaviMendesDev    schedule 09.07.2021
comment
@DaviMendesDev, конечно, я уже обновил свой вопрос, включив в него Kernel.php. Не могли бы вы пожалуйста посмотреть?   -  person Gita Prasetya Adiguna    schedule 10.07.2021


Ответы (1)


попробуй это:

export const sendLogin = (data) => {
    axios.defaults.withCredentials = true;
    const response = axios.get(apiUrl('sanctum/csrf-cookie','backend-non-api-route')).then(response => {
        return axios.post(apiUrl('user/login','backend-non-api-route'),data,{ 
            xsrfHeaderName: "X-XSRF-TOKEN", // change the name of the header to "X-XSRF-TOKEN" and it should works
            withCredentials: true
          });
    })
    return response;
}

EDIT: Читая документацию Sanctum, я получаю этот фрагмент документа:

Во время этого запроса Laravel установит файл cookie XSRF-TOKEN, содержащий текущий токен CSRF. Затем этот токен следует передавать в заголовке X-XSRF-TOKEN при последующих запросах, что некоторые клиентские библиотеки HTTP, такие как Axios и Angular HttpClient, будут делать автоматически за вас. Если ваша HTTP-библиотека JavaScript не устанавливает значение для вас, вам нужно будет вручную установить заголовок X-XSRF-TOKEN, чтобы он соответствовал значению файла cookie XSRF-TOKEN, установленного этим маршрутом.

и этот другой ответ говорит, что вы должны использовать только один из них обоих (X-CSRF-TOKEN и X-XSRF-TOKEN).

person DaviMendesDev    schedule 10.07.2021