TokenMismatchException в строке VerifyCsrfToken.php 67
Я знаю, что это известная ошибка с такими вещами, как формы в Laravel. Но я столкнулся с проблемой базовой аутентификации в Laravel 5.2.
Я создал auth с помощью Laravel;
php artisan make:auth
Теперь у меня такая же копия кода на моем сервере и в моем локальном. На моем местном уровне я вообще ничего не понимаю. Однако на моем сервере, когда я пытаюсь зарегистрировать пользователя, я получаю сообщение об ошибке TokenMismatchException in VerifyCsrfToken.php Line 67
Как локальная, так и серверная среды находятся в синхронизации, но я все равно получаю ошибку при регистрации. Любая помощь в том, как я могу это исправить?
![Снимок экрана с ошибкой]()
Ответы
Ответ 1
Я предполагаю, что вы добавили $this->middleware('auth');
внутри конструктора вашего контроллера, чтобы заставить работать аутентификацию. В ваших логинах/регистрационных формах, если вы используете {!! Form::someElement !!}
{!! Form::someElement !!}
, также добавьте следующую строку вверху:
{!! csrf_field() !!}
Или, если вы используете входные теги внутри форм, просто добавьте следующую строку после <form>
:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Надеюсь это поможет.
Ответ 2
У меня была аналогичная проблема, и это было простое исправление.
Добавьте это в область метатега HTML:
<meta name="csrf-token" content="{{ csrf_token() }}">
Затем под ссылкой JQuery добавьте этот код:
<script type="text/javascript">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
Если вы используете форму HTML-формы submit (не AJAX), вам нужно поставить:
{{ csrf_field() }}
внутри ваших тегов формы.
Ответ 3
Вам нужно иметь эту строку кода в разделе вашего HTML-документа, вы можете сделать это по умолчанию, это не повредит:
<meta name="csrf-token" content="{{ csrf_token() }}" />
И в вашей форме вам нужно добавить это скрытое поле ввода:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Вот оно, работало для меня.
Ответ 4
Я собирался начать вытаскивать свои волосы!
Пожалуйста, проверьте свой домен cookie сеанса в конфигурации session.php. Существует опция домена, которая должна соответствовать вашей среде, и хорошая практика заключается в том, чтобы этот настраиваемый с вами файл .env для разработки.
'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),
Ответ 5
Если ничего не работает, вы можете удалить проверку безопасности CSRF, перейдя в файл App/Http/Middleware/VerifyCsrfToken.php и добавив свои маршруты в защищенный $excpt.
например. если я хочу удалить защиту CSRF со всех маршрутов.
protected $except = [
'/*'
];
P.S, хотя его хорошая практика включает защиту CSRF.
Ответ 6
Я столкнулся с той же проблемой, когда мое приложение запускалось на laravel 5.4
php artisan session:table
php artisan make:auth
php artisan migrate
.. а затем следующая команда работает для меня:)
chmod 777 storage/framework/sessions/
Еще одна возможность этой проблемы, если вы установили SESSION_DOMAIN (в .env), отличный от HOST_NAME
Счастливое кодирование
Ответ 7
Я также столкнулся с той же проблемой и решил ее позже.
прежде всего выполните команду artisan:
php artisan cache: clear
И после этого перезапустите проект.
Надеюсь, это поможет.
Ответ 8
Есть много возможностей, которые могут вызвать эту проблему.
позвольте мне упомянуть об этом.
Вы случайно изменили конфигурационный файл session.php?
Возможно, вы изменили значение домена с нуля на имя вашего сайта или что-то еще в session.php
'domain' => null,
Неправильная конфигурация в этом файле может вызвать эту проблему.
Ответ 9
Ваш метод формы - это сообщение. Поэтому откройте файл промежуточного ПО /VerifyCsrfToken.php, найдите метод isReading() и добавьте метод "POST" в массив.
Ответ 10
Я также получаю эту ошибку, но я решил проблему. Если вы используете php artisan serve
, добавьте этот код {{ csrf_field() }}
под {!! Form::open() !!}
- php artisan cache: clear
- Очистить кеш и браузер cookie
- Использование личного браузера (Mozilla)/Окно инкогнито (Chrome)
- Откройте форму/страницу, а затем снова отправьте ребятам
Я надеюсь, что это решит вашу проблему.
Ответ 11
Убедитесь, что
{!! csrf_field() !!}
добавляется в вашу форму в синтаксисе лезвия.
или синтаксис простой формы
<input type="hidden" name="_token" value="{{ csrf_token() }}">
вместе с этим,
убедитесь, что в session.php(в папке конфигурации) правильно установлено следующее.
'domain' => env('SESSION_DOMAIN', 'sample-project.com'),
или обновить то же самое в файле .env, например,
SESSION_DOMAIN=sample-project.com
В моем случае {!! csrf_field()!!} был добавлен правильно, но SESSION_DOMAIN настроен неправильно. После того, как я изменил его с правильным значением в моем .ENV файле, он сработал.
Ответ 12
изменить драйвер сеанса в session.php, чтобы файл my был установлен в массив.
Ответ 13
Может также возникнуть, если пользователь "www-data" не имеет прав доступа/записи
в папке:
'Laravel-проект-папка'/хранение/рамки/сессии/
Ответ 14
Ниже работал у меня.
<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
Ответ 15
Вы проверили скрытое поле ввода, в котором генерируется токен?
Если он равен нулю, ваш токен не возвращается функцией csrf_token. Вы должны написать свой маршрут, который отображает форму внутри группы промежуточного программного обеспечения, предоставляя laravel следующим образом:
Route::group(['middleware' => 'web'], function () {
Route::get('/', function () {
return view('welcome');
});
Здесь корневой маршрут содержит мою страницу регистрации, для которой требуется токен csrf. Этот токен управляется laravel 5.2.7 внутри промежуточного ПО "web" в kernel.php.
Не забудьте вставить {!! csrf_field()!!} внутри формы.
Ответ 16
По умолчанию cookie сеанса будет отправляться обратно на сервер, если браузер имеет соединение HTTPS. Вы можете отключить его в вашем .ENV файле (обескуражен для производства)
SESSION_SECURE_COOKIE=false
Или вы можете отключить его в config/session.php
'secure' => false,
Ответ 17
Перейдите к app/provides
.
Затем в файле RouteServiceProvider.php
вам нужно удалить 'middleware' => 'web'
в protected function mapWebRoutes(Router $router)
Ответ 18
Поместите этот код между тегами <form>
и </form>
:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Ответ 19
У меня была такая же проблема, но я решил ее, исправив мою форму открытой, как показано ниже:
{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}
Если это не решит вашу проблему, можете ли вы показать, как вы открыли форму?
Ответ 20
Вы должны попробовать это.
Добавьте {{csrf_field()}} сразу после вашего тега открытия формы, как это.
<form method="POST" action="/your/{{ $action_id }}">
{{ csrf_field() }}
Ответ 21
Вы перенаправляете его обратно после публикации? У меня была эта проблема, и я смог ее решить, возвращая ту же точку зрения вместо использования Redirect:: back().
Используйте это представление return() → with() вместо Redirect:: back().
Ответ 22
Для меня мне пришлось использовать безопасные https, а не http.
Ответ 23
попробуйте изменить время жизни сеанса на config/session.php
следующим образом:
'lifetime' => 120,
до 'lifetime' => 360,
Здесь я устанавливаю время жизни на 360, надеюсь, что эта помощь.
Ответ 24
Я получил эту ошибку при загрузке больших файлов (видео). Форма работала нормально, без ошибок рассогласования, но как только кто-то подключил большой видеофайл, он выбросил бы эту токенную ошибку. Настройка максимально допустимого размера файла и увеличение времени обработки позволила мне решить эту проблему. Не уверен, почему Laravel выдает эту ошибку в этом случае, но вот еще одно потенциальное решение для вас.
Вот ответ StackOverflow, в котором более подробно рассказывается о том, как решить проблему с большой загрузкой файлов.
PHP изменит максимальный размер загружаемого файла
Ответ 25
В моем случае у меня возникла проблема при попытке войти в систему после перезапуска сервера, но у меня было поле csrf в форме, и я не обновлял страницу, или что-то не так в кеше.
Это было мое решение. Я поместил этот фрагмент кода в папку \App\Http\Middleware\VerifyCsrfToken.php
public function handle($request, Closure $next)
{
try {
return parent::handle($request, $next); // TODO: Change the autogenerated stub
} catch(TokenMismatchException $e) {
return redirect()->back();
}
}
То, что он делает, - это перехват TokenMismatchException, а затем перенаправление пользователя на страницу (перезагрузка токена csrf в заголовке и в поле).
Это может не работать всегда, но это сработало для моей проблемы.
Ответ 26
Попробуйте кеш php artisan: очистите или вручную удалите кеш-память с сервера.
Ответ 27
Если вы отметите некоторые формы по умолчанию из Laravel 5.4, вы заполните, как это делается:
<form class="form-horizontal" role="form" method="POST" action="{{ route('password.email') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required> @if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span> @endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Send Password Reset Link
</button>
</div>
</div>
</form>
{{ csrf_field() }}
- наиболее подходящий способ добавить настраиваемое скрытое поле, которое будет понимать Laravel.
csrf_filed()
использует csrf_token()
внутри, как вы можете видеть:
if (! function_exists('csrf_field')) {
/**
* Generate a CSRF token form field.
*
* @return \Illuminate\Support\HtmlString
*/
function csrf_field()
{
return new HtmlString('<input type="hidden" name="_token" value="'.csrf_token().'">');
}
}
И метод csrf_field()
использует сеанс для задания.
function csrf_token()
{
$session = app('session');
if (isset($session)) {
return $session->token();
}
throw new RuntimeException('Application session store not set.');
}
Ответ 28
У меня такая же проблема, когда я сначала тестировал Laravel 5.2, затем я узнал о {{!! csrf_field() !!}}
, который должен быть добавлен в форму и которая ее решила. Но позже я узнал о Form Helpers, это заботится о защите CSRF и не дает никаких ошибок. Хотя помощники формы не могут быть доступны после Laravel 5.2, вы все равно можете использовать их из LaravelCollective.
Ответ 29
Вы можете решить, удалив строку. перейдите в приложение \http\kernel.php, здесь вы можете увидеть строку \App\Http\Middleware\VerifyCsrfToken:: class, это сработало для меня.
Ответ 30
Проблема у меня заключалась в небольшом значении post_max_size в php.ini.