Если Ваша веб-платформа включает защиту от подделки межсайтовых запросов (CSRF), Вам необходимо убедиться, что каждый запрос Inertia включает необходимый токен для запросов POST
, PUT
, PATCH
и DELETE
.
Одно из решений - включать токен CSRF в качестве свойства в каждый ответ. Затем Вы можете использовать токен при выполнении запросов Inertia.
this.$inertia.post('/users', {
name: this.name,
email: this.email,
_token: this.$page.props.csrf_token,
})
Вы даже можете использовать функцию общих данных , чтобы автоматически включать csrf_token
в каждый ответ.
Однако лучше использовать для этого функцию CSRF, уже встроенную в axios. Axios - это HTTP-библиотека, которую Inertia использует под капотом.
Axios автоматически проверяет наличие cookie-файла XSRF-TOKEN
. Если он присутствует, он будет включать токен в заголовок X-XSRF-TOKEN
для любых запросов, которые он делает.
Самый простой способ реализовать это - использовать промежуточное ПО на стороне сервера. Просто включите файл куки XSRF-TOKEN
в каждый ответ, а затем проверьте токен, используя заголовок X-XSRF-TOKEN
, отправленный в запросах от axios.
Некоторые фреймворки, такие как Laravel, делают это автоматически, то есть там конфигурация не требуется.
csrf-token
из Вашего проекта, так как это помешает правильному обновлению токена CSRF.Когда происходит несоответствие токена CSRF, Ваша веб-платформа, скорее всего, выдаст исключение, которое приведет к ответу с ошибкой. Например, в Laravel генерируется исключение TokenMismatchException
, что приводит к странице с ошибкой 419
. Поскольку это недействительный ответ Inertia, ошибка отображается в модальном окне.
Но это не лучший пользовательский опыт. Лучший способ справиться с этими ошибками - вернуть перенаправление обратно на предыдущую страницу вместе с флэш-сообщением о том, что срок действия страницы истек. Это приведет к действительному ответу Inertia с флэш-сообщением, доступным как свойство, которое Вы затем можете отобразить пользователю. Обратите внимание: Вам нужно будет поделиться своими быстрые сообщениями с Inertia.js, чтобы это работало.
use Throwable;
use Inertia\Inertia;
/**
* Подготовить исключение для рендеринга.
*
* @param \Throwable $e
* @return \Throwable
*/
public function render($request, Throwable $e)
{
$response = parent::render($request, $e);
if ($response->status() === 419) {
return back()->with([
'message' => 'Срок действия страницы истек, попробуйте еще раз.',
]);
}
return $response;
}
Конечный результат - гораздо лучший опыт для Ваших пользователей. Вместо того, чтобы видеть модальное окно ошибки, они получают сообщение о том, что срок действия страницы истек, и их просят повторить попытку.