Laravel 8 Sanctum SPA Auth - хранилище сессий не установлено по запросу

Я пытаюсь реализовать аутентификацию Sanctum SPA. При попытке входа в систему появляется следующая ошибка ( только в рабочей среде ):

production.ERROR: Session store not set on request. {"userId":1,"exception":"[object] (RuntimeException(code: 0): Session store not set on request. at /app/vendor/laravel/framework/src/Illuminate/Http/Request.php:483)

Выполнил все шаги в документации . Первый звонок sanctum/csrf-cookieЗапрос GET, затем мой запрос POST API с прикрепленным файлом cookie сеанса. Спасибо за любые советы!

Мой login метод в AuthController.php, где исключение происходит в строке 28.

Мой Http\Kernel.php файл с посредниками для конечных точек API.

Моя конечная точка API в routes/api.php

7 ответов

Решение

Маршруты аутентификации должны быть в routes/web.php файл.

Добавлено в app / Http / Kernel.php:

у меня это сработало.

На будущее, правильный способ решить проблему:

  1. Опубликовать конфигурацию Sanctum

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

  1. Сообщите промежуточному программному обеспечению вашего приложения/API об использовании сеансов с отслеживанием состояния, добавив EnsureFrontendRequestsAreStatefulкласс на app/Http/Kernel.phpпод правильными группами маршрутов (api,web и т. д.)
      'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
...  

Следующие два шага очень важны

  1. Добавьте внешние домены/IP-адреса, которым разрешено использовать сеансы Sanctum SPA. Это можно сделать либо путем добавления SANCTUM_STATEFUL_DOMAINSключ в вашем .envфайл или изменение значения ключа с отслеживанием состояния вconfig/sanctum.phpфайл.
  1. Для каждого запроса к конечным точкам, защищенным промежуточным программным обеспечением святилища, он должен включать originили же refererзаголовок. Дополнительно включайте X-XSRF-TOKENзаголовок, если применимо.

Для Laravel 10.X в случае конфигураций SPA удалось решить эту проблему согласно документации https://laravel.com/docs/10.x/sanctum#spa-configuration без добавления\Illuminate\Session\Middleware\StartSession::classв группах промежуточного программного обеспечения'api'изapp/Http/Kernel.phpкак предложено в некоторых комментариях.

Для меня это сработало, так как я указал заголовок запроса источника из внешнего интерфейса, который точно соответствовал любому изapp/config/sanctum.phpдомены с состоянием, определенные в'stateful'конфигурация:

      
    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        '%s%s',
        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
        Sanctum::currentApplicationUrlWithPort()
    ))),

Несоответствующий исходный заголовок приведет к ошибке в сообщении. Обязательно сопоставьте заголовок источника запроса (или реферера) с файлом .env или в нем, как предложили некоторые комментаторы. Если вы включаете порт в заголовок, обязательно добавьте его вSANCTUM_STATEFUL_DOMAINSилиAPI_URLконфиг.

Конфигурация сAPP_URL=http://localhostнапример приметorigin='localhost' но нетorigin='localhost:8000'

Дополнительная информация:

Ошибка может быть связана с\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::classпромежуточное программное обеспечение дает сбойfromFrontend()проверьте (из-за несоответствия домена и конфигурации), которая не будет загружать необходимое промежуточное ПО сеанса. Успешная загрузка добавитStartSessionпромежуточное программное обеспечение, но включает в себя другое необходимое промежуточное программное обеспечение, которое может быть пропущено при добавлении промежуточного программного обеспечения вapiраздел напрямую.

Дополнительная информация от пользователя dcon123 здесь:https://laracasts.com/discuss/channels/laravel/sanctum-throws-session-store-not-set-on-request?page=1&replyId=871059

      'api' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,

    \Illuminate\Session\Middleware\StartSession::class, // Add this line
],

StartSession.phpэто менеджер сеансов, который обрабатывает сеанс каждого запроса API.

Добавленif (!$request->is('api/*') && $request->session()->all())вapp/Http/Middleware/Authenticate.phpЗапрос давал сбой из-за проверки подлинности промежуточного программного обеспечения для сеанса, поэтому это помогло.PS это исправление для использования святилища.

В вашем файле .env проверьте, что APP_URL={your app base url}правильно.

Другие вопросы по тегам