TokenMismatchException в VerifyCsrfToken.php строка 67



Я знаю, что это известная ошибка с такими вещами, как формы в Ларавеле. Но я столкнулся с проблемой с базовой аутентификацией в Laravel 5.2.



Я создал auth, используя Laravel;



php artisan make:auth


Теперь у меня есть такая же копия кода на моем сервере и моем локальном. На моем местном я не получаю никаких проблем вообще. Однако на моем сервере, когда я пытаюсь зарегистрировать пользователя, я получаю сообщение об ошибке TokenMismatchException in VerifyCsrfToken.php Line 67



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



Скриншот ошибки

642   30  

30 ответов:

Я предполагаю, что вы добавили $this->middleware('auth'); внутри конструктора вашего контроллера, чтобы заставить аутентификацию работать. Если вы используете {!! Form::someElement !!}, Добавьте в верхней части формы для входа/регистрации следующее:

{!! csrf_field() !!}

Или если вы используете входные теги внутри ваших форм, просто добавьте это сразу после тега <form>:

<input type="hidden" name="_token" value="{{ csrf_token() }}">

Ура.

У меня была похожая проблема, и это было легко исправить.

Добавьте это в область мета-тегов 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() }} 

Внутри тегов формы.

Вам нужно иметь эту строку кода в разделе вашего HTML-документа, вы можете сделать это по умолчанию, это не принесет никакого вреда:

<meta name="csrf-token" content="{{ csrf_token() }}" />

И в вашу форму нужно добавить это скрытое поле ввода:

<input type="hidden" name="_token" value="{{ csrf_token() }}">

Вот оно, сработало на меня.

Я уже собирался начать выдергивать свои волосы!

Пожалуйста, проверьте ваш домен cookie сеанса в сеансе.PHP config. Существует вариант домена, который должен соответствовать вашей среде, и это хорошая практика, чтобы иметь это настраивается с вами .env файл для разработки.

'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),

Если ничего не работает, вы можете удалить проверку безопасности CSRF, перейдя в App / Http / Middleware/VerifyCsrfToken.php файл и добавление ваших маршрутов в protected $excpt.

Например, если я хочу удалить защиту CSRF со всех маршрутов.

protected $except = [
    '/*'
];

P. S хотя это хорошая практика, чтобы включить защиту CSRF.

Я столкнулся с той же проблемой с моим приложением, запущенным на laravel 5.4

php artisan session:table
php artisan make:auth
php artisan migrate

.. и тогда следующая команда работает для меня:)

chmod 777 storage/framework/sessions/

Еще одна возможность этой проблемы, если вы установили SESSION_DOMAIN (in .env) отличается от HOST_NAME

Счастливое кодирование

Я также столкнулся с той же проблемой и решил ее позже. прежде всего выполните команду artisan:

Php artisan cache: clear

И после этого перезапустить проект. Надеюсь, это поможет.

Есть много возможностей, которые могут вызвать эту проблему. позвольте мне упомянуть об одном. Вы случайно не изменили свой сеанс?конфигурационный файл php? Возможно, вы изменили значение домена с null на ваше имя сайта или что-то еще в сеансе.php

'domain' => null,

Неправильная конфигурация в этом файле может вызвать эту проблему.

Ваш метод формы-post. Поэтому откройте Middleware/VerifyCsrfToken .php файл, найти метод isReading () и добавить метод 'POST' в массив.

Я также получаю эту ошибку, но я решил проблему. Если вы используете php artisan serve, добавьте этот код {{ csrf_field() }} под {!! Form::open() !!}

  1. php artisan cache: clear
  2. очистить кэш и куки браузера
  3. Использование Приватного Браузера (Mozilla) / Окна Инкогнито (Chrome)
  4. откройте форму / страницу, а затем отправьте снова, ребята

Я надеюсь, что это решит вашу проблему.

Убедитесь, что

{!! csrf_field() !!}

Добавляется в вашу форму в синтаксисе Блейда.

Или в синтаксисе простой формы

<input type="hidden" name="_token" value="{{ csrf_token() }}">

Вместе с этим, убедитесь в этом во время сеанса.php (в папке config), следующее установлено правильно.

'domain' => env('SESSION_DOMAIN', 'sample-project.com'),

Или обновить то же самое в .env файл типа,

SESSION_DOMAIN=sample-project.com

В моем случае {!! csrf_field() !!} был добавлен правильно, но SESSION_DOMAIN не был настроен правильно. После того, как я изменил его с правильным значением в моем .env файл, это сработало.

Измените драйвер сеанса в сеансе.php to file mine был установлен в массив.

Также может произойти, если пользователь "www-data" не имеет прав доступа / записи на папку: 'laravel-project-folder' / storage / framework / sessions /

Вы проверили свое скрытое поле ввода, в котором генерируется токен?

Если он равен null, то ваш токен не возвращается функцией csrf_token.Вы должны написать свой маршрут, который отображает форму внутри группы промежуточного программного обеспечения, предоставляемой laravel следующим образом:

  Route::group(['middleware' => 'web'], function () {
Route::get('/', function () {
    return view('welcome');
});

Здесь корневой маршрут содержит мою страницу регистрации, которая требует маркера csrf. Этот токен управляется laravel 5.2.7 внутри промежуточного программного обеспечения " web " в ядре.РНР.

Не забудьте вставить {!! csrf_field() !!} внутри форма..

Ниже работал на меня.

<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">

Перейти к app/provides.

Затем, в файле RouteServiceProvider.php, вам придется удалить 'middleware' => 'web' в protected function mapWebRoutes(Router $router)

У меня была та же проблема, но я решил ее, исправив мою открытую форму, как показано ниже:

{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}

Если это не решит вашу проблему, не могли бы вы показать, как вы открыли форму ?

Вы должны попробовать это.

Добавьте {{csrf_field() }} сразу после открывающего форму тега.

<form method="POST" action="/your/{{ $action_id }}">
{{ csrf_field() }}    

Вы перенаправляете его обратно после публикации ? У меня была эта проблема, и я смог решить ее, вернув то же самое представление вместо использования Redirect::back().

Используйте этот вид возврата () - >with () вместо Redirect:: back ().

Для меня, я должен был использовать безопасный https, а не http.

Попробуйте изменить время жизни сеанса на config/session.php следующим образом:

'lifetime' => 120, to 'lifetime' => 360,

Здесь я установил время жизни на 360, надеюсь, это поможет.

По умолчанию сеансовые куки будут отправляться обратно на сервер только в том случае, если браузер имеет соединение HTTPS. Вы можете выключить его в своем .env файл (не рекомендуется для производства)

SESSION_SECURE_COOKIE=false

Или вы можете отключить его в config / session.php

'secure' => false,

Я получил эту ошибку при загрузке больших файлов (видео). Форма работала нормально, никакой ошибки несоответствия, но как только кто-то прикреплял большой видеофайл, он выбрасывал эту ошибку маркера. Настройка максимально допустимого размера файла и увеличение времени обработки решили эту проблему для меня. Не знаю, почему Laravel выдает эту ошибку в данном случае, но вот еще одно потенциальное решение для вас.

Вот ответ StackOverflow, который более подробно рассказывает о том, как решать большие задачи. проблема с загрузкой файлов.

PHP изменить максимальный размер загружаемого файла

В моем случае, у меня была проблема при попытке войти после перезагрузки сервера, но у меня было поле 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 в заголовке и в поле). Может, это и не всегда срабатывало, но все же срабатывало. для моей проблемы.

Попробуйте php artisan cache: очистить или вручную удалить кэш хранилища с сервера.

Если вы проверите некоторые из стандартных форм из 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.');
}

У меня такая же проблема, когда я сначала пробовал Laravel 5.2, потом я узнал о {{!! csrf_field() !!}}, который нужно добавить в форму, и это решило ее. Но позже я узнал о помощниках формы, это заботится о защите CSRF и не дает никаких ошибок. Хотя помощники форм не являются законно доступными после Laravel 5.2, вы все еще можете использовать их из LaravelCollective.

Вы можете решить, удалив строку. перейдите в раздел app\http\kernel.на PHP, здесь вы можете увидеть линию \приложения\НТТР\промежуточного\VerifyCsrfToken::класс, Этот работал для меня.

Моей задачей было уменьшить значение post_max_size в php.ини.

Поместите этот код между <form> и </form> тегом:

<input type="hidden" name="_token" value="{{ csrf_token() }}">

Comments

    Ничего не найдено.