Использование Sanctum с обычной аутентификацией Laravel

У меня есть простое веб-приложение, использующее обычную аутентификацию для всех моих веб-маршрутов. В моем приложении всего несколько мест, где я хочу иметь возможность вызывать несколько маршрутов API из Javascript. Могу ли я настроить аутентификацию Sanctum SPA для работы без входа в систему в стиле SPA?

Я выполнил инструкции на стороне сервера, и на своей странице входа в систему я выполняю запрос файлов cookie CSRF с использованием библиотеки axios, прежде чем пользователь войдет в систему с использованием стандартных маршрутов. Но когда я пытаюсь затем попасть на защищенный маршрут Sanctum, я просто перенаправляюсь на домашнюю страницу.

Ожидается ли, что авторизация на основе сеанса Sanctum должна работать с обычным входом в приложение?

редактировать

Я обнаружил проблему. ВEnsureFrontendRequestsAreStateful это функция:

public static function fromFrontend($request)
{
    $referer = Str::replaceFirst('https://', '', $request->headers->get('referer'));

    $referer = Str::replaceFirst('http://', '', $referer);

    return Str::startsWith($referer, config('sanctum.stateful', [])) ||
           Str::is(config('sanctum.stateful', []), $referer);
}

$refererв моих запросах имеет значение null, поэтому эта функция не может вернуть значение true. Если 'referer' изменить на 'host', он работает. Это приемлемо? Удовлетворяет ли он точку зрения функции, что "данный запрос исходит от внешнего интерфейса приложения", или есть последствия для безопасности, которые я не учел?

2 ответа

Решение

"Referer" работает при обращении к конечной точке API из Javascript, но при обращении к нему из Postman или в окне браузера отсутствие заголовков вызывает проблему. Таким образом, при простом тестировании GET он перенаправляется для входа в систему, но работает нормально при вызове из библиотеки Axios в компоненте Vue.

'Referer' работает и в почтальоне, вам нужно только добавить заголовок к вашему запросу Referer -> {{host}}. host это переменная почтальона, или вы можете ввести ее как localhost. Sanctum по умолчанию проверяет этот референт localhost, localhost:3000,127.0.0.1,127.0.0.1:8000,::1, но вы можете указать свой собственный референт, добавив здесь переменную в файл env SANCTUM_STATEFUL_DOMAINS=your-app-domain.com.

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