CSRF защита

Создание запросов

Если Ваша веб-платформа включает защиту от подделки межсайтовых запросов (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, делают это автоматически, то есть там конфигурация не требуется.

Если Вы используете 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;
}
Расширьте метод render() в Вашем App\Exceptions\Handler.php.

Конечный результат - гораздо лучший опыт для Ваших пользователей. Вместо того, чтобы видеть модальное окно ошибки, они получают сообщение о том, что срок действия страницы истек, и их просят повторить попытку.