@QcfgAlexandr

Как решить проблему с TokenMismatchException Laravel?

Суть проблемы:
При отправке Ajax запроса, с истекшим csrf_token в laravel.log пишется ошибка.
Ошибка

[2019-07-03 19:35:48] local.ERROR: exception 'Illuminate\Session\TokenMismatchException' in /site.ru/public_html/bootstrap/cache/compiled.php:2710
Stack trace:
#0 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#1 /site.ru/public_html/bootstrap/cache/compiled.php(9188): call_user_func_array(Array, Array)
#2 /site.ru/public_html/bootstrap/cache/compiled.php(12456): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#3 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#4 /site.ru/public_html/bootstrap/cache/compiled.php(9188): call_user_func_array(Array, Array)
#5 /site.ru/public_html/bootstrap/cache/compiled.php(11104): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#6 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#7 /site.ru/public_html/bootstrap/cache/compiled.php(9188): call_user_func_array(Array, Array)
#8 /site.ru/public_html/bootstrap/cache/compiled.php(12193): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#9 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 /site.ru/public_html/bootstrap/cache/compiled.php(9188): call_user_func_array(Array, Array)
#11 /site.ru/public_html/bootstrap/cache/compiled.php(12132): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#12 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#13 /site.ru/public_html/bootstrap/cache/compiled.php(9188): call_user_func_array(Array, Array)
#14 /site.ru/public_html/app/Http/Middleware/CheckRkn.php(32): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#15 [internal function]: App\Http\Middleware\CheckRkn->handle(Object(Illuminate\Http\Request), Object(Closure))
#16 /site.ru/public_html/bootstrap/cache/compiled.php(9188): call_user_func_array(Array, Array)
#17 /site.ru/public_html/app/Http/Middleware/CheckForMaintenanceMode.php(23): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#18 [internal function]: App\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#19 /site.ru/public_html/bootstrap/cache/compiled.php(9188): call_user_func_array(Array, Array)
#20 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#21 /site.ru/public_html/bootstrap/cache/compiled.php(9178): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#22 /site.ru/public_html/bootstrap/cache/compiled.php(2035): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#23 /site.ru/public_html/bootstrap/cache/compiled.php(2018): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#24 /site.ru/public_html/public/index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#25 {main}


Добавил в /app/Exceptions/Handler.php проверку, в случае ошибки пользователю возвращается соответствующая ошибка и новый csrf_token.

Но в логи ошибка продолжает записываться, подозреваю что проблема в порядке в порядке подключения $middleware "Kernel.php", но сам решить ее не могу.

Kernel.php

protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
];


Подскажите, как это исправить ?
  • Вопрос задан
  • 243 просмотра
Решения вопроса 1
@QcfgAlexandr Автор вопроса
А вот и решение:

Нужно добавить проверку в функции "report" а не в "render" в /app/Exceptions/Handler.php

Сама проверка:
if ($e instanceof \Illuminate\Session\TokenMismatchException) {
	return response()->json(['msg'=> 'session expired', 'token'=> csrf_token()], 401);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Kostik_1993
Web Developer
Проблема в том что первый запрос все равно с неправильным токеном.

Если вы хотите решить свою проблему вам нужно создать отдельный роут при обращении к которому будет отдаваться новый токен. Его можно сделать методом get

Ну а на фронтенде по таймеру запрашивать новый и обновлять
Ответ написан
Комментировать
@kirill-93
Можно отключить проверку токена для аякс запросов или, как писали выше, запрашивать по таймауту токен.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы