2015-09-18 4 views
0

Я разработал приложение с laravel локально с homestead, и теперь я пытаюсь запустить его на общем хосте. Как только я нажал кнопку входа, я получаю исключение: TokenMismatchException in VerifyCsrfToken.php line 53Laravel 5 TokenMismatchException при входе

Я читал, что у многих людей проблемы с TokenMismatchException, но все предлагаемые решения не сработали для меня. Я удалил все файлы в папке storage/framework/session (и папка имела 777 разрешений). Я удалил все файлы cookie, и поскольку я использую {!! Form:open !!}, скрытое поле _token существует (я также разместил исходный код).

Все мое приложение ожидает входа пользователя в систему, поэтому сразу после посещения страницы я получаю перенаправление на форму входа.

авториз/login.blade.php

@extends('app') 

@section('content') 
<div class="container-fluid"> 
    <div class="row"> 
     <div class="col-md-8 col-md-offset-2"> 
      <div class="panel panel-default"> 
       <div class="panel-heading">Login</div> 
       <div class="panel-body"> 

        {!! Form::open(array('url' => '/auth/login', 'class' => 'form-horizontal')) !!} 

         <div class="form-group"> 
          <label class="col-md-4 control-label">E-Mail Address</label> 
          <div class="col-md-6"> 
            {!! Form::email('email', null, ['class' => 'form-control']) !!} 
          </div> 
         </div> 

         <div class="form-group"> 
          <label class="col-md-4 control-label">Password</label> 
          <div class="col-md-6"> 
           {!! Form::password('password', ['class' => 'form-control']) !!} 
          </div> 
         </div> 

         <div class="form-group"> 
          <div class="col-md-6 col-md-offset-4"> 
           {!! Form::checkbox('remember', '1', false, ['id' => 'remember']) !!}&nbsp; 
           {!! Form::label('remember', 'Remember Me') !!} 
          </div> 
         </div> 

         <div class="form-group"> 
          <div class="col-md-6 col-md-offset-4"> 
           {!! Form::submit("Login", ['class' => 'btn btn-block btn-primary']) !!} 
          </div> 
         </div> 

        {!! Form::close() !!} 

        @if (count($errors) > 0) 
         <div class="alert alert-danger"> 
          <strong>Whoops!</strong> There were some problems with your input.<br><br> 
          <ul> 
           @foreach ($errors->all() as $error) 
            <li>{{ $error }}</li> 
           @endforeach 
          </ul> 
         </div> 
        @endif 

       </div> 
      </div> 
     </div> 
    </div> 
</div> 
@endsection 

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

<input name="_token" type="hidden" value="HoSZ4shS8b1avwrkJZzGiUQCWRZL0VPtj3mfvJmI"> 

    <div class="form-group"> 
     <label class="col-md-4 control-label">E-Mail Address</label> 
     <div class="col-md-6"> 
      <input class="form-control" name="email" type="email"> 
     </div> 
    </div> 

    <div class="form-group"> 
     <label class="col-md-4 control-label">Password</label> 
     <div class="col-md-6"> 
      <input class="form-control" name="password" type="password" value=""> 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-6 col-md-offset-4"> 
      <input id="remember" name="remember" type="checkbox" value="1">&nbsp; 
      <label for="remember">Remember Me</label> 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-6 col-md-offset-4"> 
      <input class="btn btn-block btn-primary" type="submit" value="Login"> 
     </div> 
    </div> 

</form> 

Часть моего routes.php

Route::get('auth/login', 'Auth\[email protected]'); 
Route::post('auth/login', 'Auth\[email protected]'); 
Route::get('auth/logout', 'Auth\[email protected]'); 

Я m не уверен, какой код нужен, чтобы увидеть, чтобы помочь мне с этим, пожалуйста, дайте мне знать, если мне нужно Еще несколько.

Спасибо всем, кто интересуется моим вопросом.

+0

Попробуйте нажать Shift + F5, чтобы обновить страницу. Если он не работает, дайте мне знать. – dzerow

+0

@dzerow Извините, не работает. Пробовал его в форме входа в систему, но также, когда отображается исключение. – oliverspies

+0

Есть ли какой-либо AJAX? Можете ли вы изменить код, чтобы отобразить открывающий тег формы? – dzerow

ответ

0

Я как-то решил это сейчас. Я установил Laravel с нуля на сервер и попытался скопировать как можно меньше и сделать большинство изменений вручную. Однако не знаю, что привело к этому Исключению.

Вот нить, которая привела меня к решению: https://laracasts.com/discuss/channels/code-review/request-session-token-not-equal-token/

1

Правильно ли указан URL-адрес в теге <form>? Имя хоста совпадает с именем, которое вы посещаете на странице?

поясню:

Представьте, что вы разрабатываете сайт на http://www.mypage.com и в то время как вы разрабатываете, вы посещаете http://localhost.

Если вы посещаете http://localhost/auth/login и форма тег выглядит следующим образом:

<form action="http://www.mypage.com/something"> 

Вы собираетесь получить TokenMismatchException при отправке формы.

Почему? Это все о куках.

Когда вы заходите на страницу по адресу http://localhost, Laravel создает сеанс и сохраняет идентификатор сеанса в вашем браузере в файле cookie. Куки-файлы (обычно) доступны только для страниц с одного и того же хоста, поэтому, если вы посещаете http://localhost/page1 и http://localhost/page2, сервер знает, что эти два посещения являются частью одного и того же сеанса, потому что cookie доступен для обоих посещений страниц.

Если, с другой стороны, вы посещаете http://localhost/page1, то вы посетите http://www.mypage.com/page2, сервер не имеет возможности узнать, что эти два посещения являются частью той же самой сессии, так как печенье, который был установлен, когда вы посетили page1 не доступно, когда вы посещаете page2 (потому что имя хоста отличается).

Итак, вот что я думаю, что происходит:

  1. вы посещаете http://localhost/auth/login в то время как вы разрабатываете.

  2. Laravel устанавливает маркер CSRF и добавляет его в форму на странице

  3. Laravel также вставляет действие для тега формы, как http://www.mypage.com/auth/login (или любое значение по умолчанию).

  4. щелчкеОтправить и посылается запрос http://www.mypage.com/auth/login (потому что это то, что в виде тега)

  5. Laravel получает маркер, который не соответствует тому, что он сохранил для сеанса на http://www.mypage.com (если сеанс даже существует), поскольку он не имеет идентификатора сеанса, который он назначен на сессию посещения http://localhost

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

+0

Действие формы - это тот же URL-адрес, что и страница, к которой относится форма. Но спасибо за это подробное объяснение в любом случае. Действие формы генерируется и не жестко закодировано: {!! Форма :: open (массив ('url' => '/ auth/login') !!} – oliverspies

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