@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,
];


Подскажите, как это исправить ?
  • Вопрос задан
  • 261 просмотр
Решения вопроса 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
Можно отключить проверку токена для аякс запросов или, как писали выше, запрашивать по таймауту токен.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы