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

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