Laravel Sanctum auth: промежуточное ПО sanctum с неаутентифицированным ответом Angular SPA
У меня есть приложение со следующей настройкой:
Laravel
Хост: appname.local:8000
Переменные среды:
- SESSION_DRIVER= база данных
- SESSION_LIFETIME=480
- SESSION_CONNECTION=mysql
- SESSION_DOMAIN=.appname.local
- SESSION_SECURE_COOKIE= ложь
- SESSION_COOKIE=appnameapi_session
- SANCTUM_STATEFUL_DOMAINS='. Appname.local,localhost,127.0.0.1'
Угловой
Хост: appname.local:4200
Что работает на данный момент:
- Я могу вызвать конечную точку csrf-cookie Sanctum, которая устанавливает токен CSRF в моем браузере.
- Затем я могу вызвать конечную точку входа в мой API для аутентификации пользователя в моем приложении Laravel с помощью Auth:: try (). Это создаст новую запись в таблице сеансов, как показано ниже.
Angular методы для получения токена и аутентификации пользователя
Запись в базе данных сеанса после успешной аутентификации
Что не работает:
Последующие запросы к маршрутам, защищенным следующим промежуточным программным обеспечением: auth:sanctum, приводят к неаутентифицированным ответам. HTTP-запросы никогда не доходят до моих контроллеров.
auth: защищенные маршруты в святилище
Но я вижу в консоли разработчика, что файлы cookie отправляются. Поэтому я не понимаю, почему Sanctum не получает авторизацию
Я выполнил несколько руководств и, кажется, не могу понять, почему промежуточное ПО Laravel Authenticate не может увидеть, что я уже аутентифицировал своего пользователя.
Кто-нибудь знает, что я могу делать не так?
5 ответов
Ответы @agm1984 и @Eden Webstudio были весьма полезны. Однако они не решили мою проблему.
После дополнительной отладки я заметил, что логика охранника святилища ищет охранника в
config/sanctum.php
. Его значение по умолчанию - web. Моя защита по умолчанию для защищенных маршрутов - это api guard, которую я использовал во время процесса аутентификации.
После установки ключа защиты в config / sanctum.php с помощью "api" аутентификация, похоже, работает без сбоев. Честно говоря, я не могу вспомнить, почему я решил использовать драйвер сеанса для своего api guard.
конфиг / sanctum.php
config / auth.php
Laravel Sanctum, похоже, не поддерживает домены с подстановочными знаками для SPA.
Попробуйте удалить точку.
SANCTUM_STATEFUL_DOMAINS='appname.local'
Вам может потребоваться другое решение для поддоменов с подстановочными знаками. Вы можете посмотреть вариант токена на предъявителя. Однако я не проверял это.
Я думаю, что Иден прав. Я посещаю этот вопрос по не связанным причинам, но для поддержки поддоменов вы можете поставить точку вSESSION_DOMAIN
переменная env, но никогда SANCTUM_STATEFUL_DOMAINS
.
Вот допустимая конфигурация env как для локальной, так и для производственной среды:
./.env
# localhost
SANCTUM_STATEFUL_DOMAINS="angular-site.test"
SESSION_DOMAIN=".angular-site.test"
# production
# SANCTUM_STATEFUL_DOMAINS="hockeysticks.net"
# SESSION_DOMAIN=".hockeysticks.net"
Это позволит файлам cookie работать в нескольких поддоменах, таких как auth.hockeysticks.net
, product.hockeysticks.net
, service.hockeysticks.net
, а также api.hockeysticks.net
.
Если человек ставит точку SESSION_DOMAIN
, файлы cookie по-прежнему будут работать, если нет поддоменов, но теоретически безопаснее их пропустить в этом случае.
Вот видео Мохамеда Саида, разработчика Laravel, рассказывающего о Sanctum: https://www.youtube.com/watch?v=Kd3hcrxtTHA. В нем он проходит через логику аутентификации.
Я была такая же проблема. Я обнаружил, что Sanctum SPA API работает нормально, если запрос сделан из приложения, не настроенного на порт №
вы можете разместить свое веб-приложение на
appname.local
вместо appname.local:4200
Если вы используете локальный хост для внешнего и внутреннего интерфейса с разными портами, например:
Угловой/ионный
Хост: локальный: 8100
Ларавель v8
Хост: локальный: 8000
Попробуйте настроить ./env на:
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8100
Имейте в виду, я установил следующее после ответа @Gloire