Как решить, что Laravel не генерирует токен CSRF

#php #ajax #laravel

Вопрос:

Итак, я использовал jQuery для подключения к функции контроллера, которая проверяет подлинность данных и отправляет их через AJAX, используя этот код. Это работало безупречно, пока я не взял выходной в субботу. Возвращаясь вчера к проекту, я продолжаю сталкиваться с этой ошибкой с кодом HTTP 419

 "message": "CSRF token mismatch.",
"exception": "Symfony\Component\HttpKernel\Exception\HttpException",
"file": "C:\workspace\app_name\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php",
"line": 387,
 

Поэтому я попытался повторить маркер CSRF, но он пуст! Имейте в виду, что он отлично работал в пятницу, а затем наступило воскресенье (вчера), без внешнего ввода, это просто случайно поразило меня этим. В чем может быть причина того, что он не генерирует токен?

Комментарии:

1. HTTP-код 419 используется платформой Laravel, когда токен CSRF отсутствует или истек срок действия.

2. Прежде всего, спасибо, что нашли время. Если срок действия токена истекает, как я могу его восстановить?

3. попробуйте ключ php artisan:сгенерируйте

4. Привет, Джон, это используется для создания ключа приложения в файле .env, верно? Я все еще пробовал, но, к сожалению, ничего не вышло.

5. Хорошо. как только вы попробуете использовать другой браузер или очистите кэш браузера . также попробуйте php artisan view:очистить конфигурацию php artisan:очистить

Ответ №1:

Хорошо, поэтому я просто быстро добавил этот код в свой код незадолго до окончания рабочего дня, поэтому у меня не было времени на тестирование, поэтому я не заметил ошибку.

 $request->session()->flush();
 

Эта строка кода отвечает за очистку сеансов. Однако в документах Laravel НЕ упоминается, что, поскольку токены CSRF также являются сеансами, использование этого в основном делает невозможным ввод-вывод в ваши базы данных, поскольку он очищает ВСЕ сеансы, включая указанные токены. Поэтому, пока это не будет решено (в идеале с помощью фрагмента кода, который очищает созданные разработчиками сеансы, сохраняя при этом встроенные сеансы Laravel), избегайте использования этой строки кода. Вместо этого используйте это для очистки отдельных сеансов:

 // Forget a single key...
$request->session()->forget('name');
 

Или это для очистки нескольких сеансов

 // Forget multiple keys...
$request->session()->forget(['name', 'status']);
 

Вы также можете узнать больше о сессиях этого прекрасного фреймворка здесь.

Наконец, спасибо @Indra Kumar S, @John Lobo, @Manjeet и @Paras Raiyani за то, что нашли время просмотреть платформу и предложить помощь другим. Определенно буду делать то же самое.

Ответ №2:

Выполните следующие команды :

 php artisan key:generate
 

а затем очистите кэш

 php artisan cache:clear 
 

Если вы хотите узнать, меняется ли значение токена, попробуйте выполнить приведенный ниже код

 Route::get('/token', function (Request $request) {
    $token = $request->session()->token();
    echo $token;
    $token = csrf_token();
    echo $token;

});
 

Комментарии:

1. Большое вам спасибо за предложение @Manjeet. Я только что нашел решение, и это было результатом моего невежества..

2. Рад, что вы нашли решение 🙂