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 ответов
На будущее, правильный способ решить проблему:
- Опубликовать конфигурацию Sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
- Сообщите промежуточному программному обеспечению вашего приложения/API об использовании сеансов с отслеживанием состояния, добавив
EnsureFrontendRequestsAreStateful
класс наapp/Http/Kernel.php
под правильными группами маршрутов (api,web и т. д.)
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
...
Следующие два шага очень важны
- Добавьте внешние домены/IP-адреса, которым разрешено использовать сеансы Sanctum SPA. Это можно сделать либо путем добавления
SANCTUM_STATEFUL_DOMAINS
ключ в вашем.env
файл или изменение значения ключа с отслеживанием состояния вconfig/sanctum.php
файл.
- Для каждого запроса к конечным точкам, защищенным промежуточным программным обеспечением святилища, он должен включать
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}
правильно.