Должны ли мы сначала сделать запрос к /sanctum/csrf-cookie перед регистрацией, чтобы войти в систему пользователя после успешной регистрации?

Мой SPA находится в том же репозитории, что и мое приложение laravel, и в документации указано, что при использовании святилища страница «логина» вашего SPA должна сначала сделать запрос к конечной точке /sanctum/csrf-cookie для инициализации защиты CSRF для приложения. Ссылка: https://laravel.com/docs/9.x/sanctum#spa-аутентификация

В моем случае, когда я успешно регистрирую пользователя, я перенаправляю его не на страницу входа для входа, а на его панель инструментов. Итак, в моем понимании, исходя из пункта выше, я думаю, что я должен сначала сделать запрос к конечной точке /sanctum/csrf-cookie, прежде чем делать запрос post к register api, чтобы у нас был зарегистрированный пользователь, защищенный от CSRF-атак, но я не уверен, что правильно интерпретирую текст.

мой метод

public function register(Request $request){
    $fields = $request->validate([
        'name' => 'required',
        'email' => 'required|email|unique:users,email', 
        'password' => 'required|confirmed',
    ]);

    $fields['password'] = bcrypt($fields['password']);
    $user = User::create($fields);
    auth()->login($user);
}

Обратитесь к этому ответу, я думаю, он ответит на ваш вопрос: stackoverflow.com/a/64695186/8485567

Bernard Wiesner 12.05.2022 07:56

@BernardWiesner Это не ответило на мой вопрос, но я узнал кое-что, что считаю очень важным для себя. Спасибо.

Alphy Gacheru 12.05.2022 08:53

Какая часть вам еще не ясна? По сути, вам не нужно вызывать конечную точку /sanctum/csrf-cookie для вашего SPA, если это SPA от первого лица.

Bernard Wiesner 12.05.2022 09:16

Эй, внимательно перечитав решение несколько раз и проведя несколько тестов, я теперь полностью понимаю. Да, этот ответ отвечает на мой вопрос. Большое спасибо.

Alphy Gacheru 12.05.2022 19:55

Кстати, у меня есть вопрос, у вас включена функция SureFrontendRequestsAreStateful в вашем Kernel.php? github.com/laravel/laravel/blob/9.x/app/Http/Kernel.php#L42

Bernard Wiesner 13.05.2022 01:38

@BernardWiesner Да, знаю.

Alphy Gacheru 13.05.2022 10:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
6
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исследовал эту проблему дальше и обнаружил, что конечная точка /sanctum/csrf-cookie на самом деле возвращает только пустой контент 204. Вы можете проверить здесь:

https://github.com/laravel/sanctum/blob/5a602d520474e103174900301d7b791e6d7cd953/src/Http/Controllers/CsrfCookieController.php#L12

return new JsonResponse(null, 204);

И комментарий в файле говорит:

Return an empty response simply to trigger the storage of the CSRF cookie in the browser.

На самом деле вы можете вызвать любую конечную точку GET API из своего SPA, и она вернет файл cookie CSRF. По сути, вам просто нужно один раз вызвать конечную точку GET перед вызовом любой конечной точки POST, включая конечную точку входа, которая должна быть POST.

Причина этого в том, что святилище по умолчанию возвращает файл cookie CSRF, когда вы вызываете конечную точку GET для SPA (используя тот же хост или тот же подхост).

Таким образом, в большинстве случаев вам может не понадобиться вызывать конечную точку /sanctum/csrf-cookie перед входом в систему, потому что вы, возможно, уже вызывали конечную точку GET до этого. Однако, если логин или любая другая конечная точка POST является первой, которую вы вызываете, вам сначала нужно вызвать указанную выше конечную точку GET, чтобы инициировать сохранение файла cookie CSRF в браузере.

Документы не так ясны в этом, я пытаюсь отправить PR, чтобы прояснить это.

Я согласен, что документы не ясны по этому поводу. Отправка PR действительно поможет другим в будущем. Спасибо за это.

Alphy Gacheru 13.05.2022 10:44

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