Подтвердить что ты не робот

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

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

Я создал auth с помощью Laravel;

php artisan make:auth

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

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

Снимок экрана с ошибкой

4b9b3361

Ответ 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.