Мой 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);
}
@BernardWiesner Это не ответило на мой вопрос, но я узнал кое-что, что считаю очень важным для себя. Спасибо.
Какая часть вам еще не ясна? По сути, вам не нужно вызывать конечную точку /sanctum/csrf-cookie для вашего SPA, если это SPA от первого лица.
Эй, внимательно перечитав решение несколько раз и проведя несколько тестов, я теперь полностью понимаю. Да, этот ответ отвечает на мой вопрос. Большое спасибо.
Кстати, у меня есть вопрос, у вас включена функция SureFrontendRequestsAreStateful в вашем Kernel.php? github.com/laravel/laravel/blob/9.x/app/Http/Kernel.php#L42
@BernardWiesner Да, знаю.






Я исследовал эту проблему дальше и обнаружил, что конечная точка /sanctum/csrf-cookie на самом деле возвращает только пустой контент 204. Вы можете проверить здесь:
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 действительно поможет другим в будущем. Спасибо за это.
Обратитесь к этому ответу, я думаю, он ответит на ваш вопрос: stackoverflow.com/a/64695186/8485567