2015-03-05 4 views
30

Только что statred новое приложение в Laravel 5 и у меня возникли некоторые проблемы, используя из коробки авт ...Laravel 5 Auth Сообщение Submit - TokenMismatchException в VerifyCsrfToken.php линии 46

я получаю: TokenMismatchException в строке VerifyCsrfToken.php 46: при отправке регистрационных форм или регистрационных форм ...

На странице формы входа в систему можно увидеть коды токенов, которые находятся в скрытом поле формы, и сеанс в этой точке - то же самое .. .

В качестве теста я также пробовал, так как некоторые другие должности предлагали комментировать // 'App \ Http \ Middleware \ VerifyCsrfToken', в app/Http/kernal.php, чтобы узнать, что произойдет. После этого каждый раз, когда я отправляю форму, я получаю сообщение, в котором говорится о перенаправлении на:/auth/login или/auth/register в зависимости от того, откуда я пришел, без успеха.

Странно, что это работало, когда я впервые установил фреймворк. Все, что я сделал с тех пор, это запустить несколько миграций и настроить некоторые из моих моделей и контроллеров и засеять db некоторыми пользовательскими данными.

ОБНОВЛЕНИЕ:

Глядя в это далее в функции tokensMatch() в строке 55 VerifyCsrfToken.php если:

var_dump($request->session()->token()); 

var_dump($request->input('_token')); 

Я могу видеть две фишки различны, но в форме, используя :

var_dump(Session::all()); 

{{{ csrf_token() }}} 

Это то же самое. Маркер сеанса изменилось, как некоторые, прежде чем он попадает в функции tokensMatch() в строке 55 из VerifyCsrfToken.php

Мой трассировки стека выглядит следующим образом:

in VerifyCsrfToken.php line 46 
at VerifyCsrfToken->handle(object(Request), object(Closure)) in VerifyCsrfToken.php line 17 
at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ShareErrorsFromSession.php line 55 
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in StartSession.php line 61 
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 36 
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in EncryptCookies.php line 40 
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 42 
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 101 
at Pipeline->then(object(Closure)) in Kernel.php line 111 
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 84 
at Kernel->handle(object(Request)) in index.php line 53 
+0

Это стандартное сообщение формы или вы используете ajax? –

+0

Стандартное сообщение. Просто используйте настройку autor Laravel 5. – trenthogan

+0

Получаете ли вы новый файл в 'storage/frameworks/sessions' каждый раз, когда вы обновляете страницу? – Marwelln

ответ

0

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

Я только что перезапустил свой сервер, и все это вернулось к нормальному состоянию.

+0

Черт, перезагрузите сервер, не повезло ... – trenthogan

23

я первый раз получил это работает удаление строки:

'Осветите \ Foundation \ Http \ MiddleWare \ VerifyCsrfToken'

из /app/Http/Resquests/Kernel.php. Однако это означает, что CSRF token check будет удален, что означает, что ваш сайт не будет защищен от подделок с запросами на межсайтовый запрос.

Update Согласно the documentation, вы должны добавить маркер CSRF в форму, добавив этот фрагмент кода в код:

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

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

+3

Но разве это безопасно? – LoveAndHappiness

+4

Это очень плохая идея. – suncoastkid

+1

@LoveAndHappiness, что действительно небезопасно, и оставит вас открытым для уязвимости, которая обычно используется: https://en.wikipedia.org/wiki/Cross-site_request_forgery –

0

решаемые вопрос:

Когда я проверил app.blade CSRF-маркер был жесткий кодированный там как <meta content="9DB/rSl5JKAkQenkfGLj4o/x6+1dIDC5m52IWJxjFfo=" name="csrf-token"> после удаления этого и добавив <meta content="authenticity_token" name="csrf-param"> сосредоточил свой вопрос.Это может помочь некоторым один :)

1

Просто Выйдите из системы и повторно Войти тот единственный путь Это неизвестная ошибка даже я получаю его в моей форме проводки иногда, но все люди на форумах все они говорят, что для сдачи но что не решает проблему просто выйти из системы и повторно Войти

+0

Это сработало для меня. Несмотря на то, что я думал, что я уже вышел из системы, я сделал принудительный выход (посетив мой URL выхода), и проблема решена. – mopo922

8

Согласно документации, может быть, почему:

ВКЛАДЫШЕ CSRF маркер в форму

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

Это то, что я делаю, чтобы исправить эту проблему.

Assume that your web server has already write access to session directory, in my case 'app/storage/framework/sessions/'. 

Execute, 

$ rm -f {your_web_app}/storage/framework/sessions/* 

Reload web in your browser and try to login again. 
2

Если вы используете шаблоны лезвия вы можете использовать положить в форму

{{ csrf_field() }} 

вместо

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

Он работал со мной в Laravel 5.1.

1

Если вы хотите избавиться от TokenMismatchException в VerifyCsrfToken.php, проверьте эту ссылку для простого решения по @Tariq Хан: TokenMismatchException in VerifyCsrfToken.php

+0

На самом деле я использую решение @Luis Morales. Из этого же вопроса. –

4

Проверьте файл routes.php. У меня также была эта ошибка, и она оказалась вызвана пустой строкой наверху (непосредственно перед открытием тега <?php). Такая глупая ошибка, надеюсь, это может кому-то помочь.

+0

ha точно такая же проблема ... –

+0

Lol, после половины дня исследования и отладки, пустая строка стала причиной такой глупой ошибки. Спасибо! – valkirilov

5

У меня была та же проблема. Я решил, изменив следующую строку в конфигурационном/session.php

'domain' => env('DOMAIN', 'yourdomainnamehere.co.uk'), 

Затем добавьте следующую строку в вас .env

DOMAIN=null 
2

У меня была та же проблема, что мое решение было

<form method="POST" action="path_to_action"> 
    <input type="hidden" name="_token" value="{{ csrf_token() }}"> 
    <input type="text" name="some_name"> 
</form> 
+0

Привет, спасибо! Он решил мою ошибку. , но я просто задаюсь вопросом, должен ли я помещать этот '' во все поле ввода для POST? –

0

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

«домен» => NULL,

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

0

Я была такая же проблема, работает PHP ремесленника конфигурации: кэш

решить все.

Я надеюсь, что это помогает кому-то

+1

Не могли бы вы объяснить свой ответ чуть подробнее? – dbmitch

0

Try PHP мастеровых маршрут: список и проверить идентификатор веб промежуточного слоя повторяется. Например (веб-сайт, веб-сайт и т. Д.).

В Laravel 5,3 веб промежуточного слоя активируется по умолчанию, я добавил

Route::group(['middleware' => 'web'], function() { ALL MY ROUTE }); 

с генерировали это TokenMismatch.

Исправление маршрутов решает проблему для меня.

Для получения дополнительной информации см Question on Laracast

0

Если вы хотите использовать CSRF в форме, то вы должны добавить эту строку в виде

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

и если вы не заинтересованы в использовании CSRF, то у вас есть для комментариев ниже строки в файле kernel.php

//\App\Http\Middleware\VerifyCsrfToken::class, 
0

Возможно, это что-то с настройками вашего домена в домене.

  1. Проверьте настройку «domain» в config/session.php.
  2. Установите его в «localhost» или в соответствующий домен, который связан с вашим приложением.
  3. Сохраните файл

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

Надеюсь, это спасет некоторые клетки мозга для кого-то.

-1
<script> 
function closedLogo() 
     {  
      $.ajax({ 
        url: '{{route('core.closed-logo')}}', 
        type: 'post', 
        success: function (data) { 
         $('#return').html(data); 
        } 
       }); 
      } 
</script> 
0

Интересно, что я столкнулся с подобной проблемой в последнее время. Я обнаружил, что есть два разных токена, созданных моим приложением Laravel 5.1. Я решил проблему, создав новый ключ приложения [php artisan key: generate]!

Смежные вопросы