2015-11-18 7 views
4

Я получаю следующее сообщение об ошибке TokenMismatchException in compiled.php line 2930:Laravel 5,1 Токен Несовпадение на Логиниться POST

Код работает на Red Hat server с php 5.6 я также испытал это на Ubuntu server работает php 5.5.9 он работал прекрасно. Он также отлично работает локально.

Кажется, создается 2 файла сеанса в storage/framework/sessions на исходном GET запросе, что означает, что при отправке формы через POST сеанс отличается.

Я проверил на

  • Redirects
  • Дата/Timezone вопрос через сервер
  • Config вопросы в session.php и app.php

Самое странное, почему существует 2 сеанса файлы генерируется по запросу GET.

Как только вы нажмете кнопку входа в систему, вы попадете в промежуточное программное обеспечение csrf, говорящее, что токены не совпадают.

Я использую генератор HTML для форм, что означает, что устанавливается _token, поэтому его не нужно выполнять вручную.

Код формы

{!! Form::open(['action' => 'Auth\[email protected]']) !!} 

<div class="panel"> 

    <div class="panel-title"> 
     Login 
    </div> 

    <div class="panel-body"> 

     <div class="grid"> 

      <div class="grid-2-4 grid-prepend-1-4 grid-append-1-4"> 

       @include('shared._errors') 

       <div class="field"> 
        {!! Form::label('username', 'Employee username') !!} 
        {!! Form::text('username') !!} 
       </div> 

       <div class="field"> 
        {!! Form::label('password', 'Password') !!} 
        {!! Form::password('password') !!} 
       </div> 

       <div class="actions"> 
        {!! Form::submit('Login', ['class' => 'button large']) !!} 
       </div> 

      </div> 

     </div> 

    </div> 

</div> 

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

Сессия конфигурации

<?php 

return [ 

    /* 
    |-------------------------------------------------------------------------- 
    | Default Session Driver 
    |-------------------------------------------------------------------------- 
    | 
    | This option controls the default session "driver" that will be used on 
    | requests. By default, we will use the lightweight native driver but 
    | you may specify any of the other wonderful drivers provided here. 
    | 
    | Supported: "file", "cookie", "database", "apc", 
    |   "memcached", "redis", "array" 
    | 
    */ 

    'driver' => env('SESSION_DRIVER', 'file'), 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Lifetime 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may specify the number of minutes that you wish the session 
    | to be allowed to remain idle before it expires. If you want them 
    | to immediately expire on the browser closing, set that option. 
    | 
    */ 

    'lifetime' => 45, 

    'expire_on_close' => true, 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Encryption 
    |-------------------------------------------------------------------------- 
    | 
    | This option allows you to easily specify that all of your session data 
    | should be encrypted before it is stored. All encryption will be run 
    | automatically by Laravel and you can use the Session like normal. 
    | 
    */ 

    'encrypt' => false, 

    /* 
    |-------------------------------------------------------------------------- 
    | Session File Location 
    |-------------------------------------------------------------------------- 
    | 
    | When using the native session driver, we need a location where session 
    | files may be stored. A default has been set for you but a different 
    | location may be specified. This is only needed for file sessions. 
    | 
    */ 

    'files' => storage_path('framework/sessions'), 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Database Connection 
    |-------------------------------------------------------------------------- 
    | 
    | When using the "database" or "redis" session drivers, you may specify a 
    | connection that should be used to manage these sessions. This should 
    | correspond to a connection in your database configuration options. 
    | 
    */ 

    'connection' => null, 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Database Table 
    |-------------------------------------------------------------------------- 
    | 
    | When using the "database" session driver, you may specify the table we 
    | should use to manage the sessions. Of course, a sensible default is 
    | provided for you; however, you are free to change this as needed. 
    | 
    */ 

    'table' => 'sessions', 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Sweeping Lottery 
    |-------------------------------------------------------------------------- 
    | 
    | Some session drivers must manually sweep their storage location to get 
    | rid of old sessions from storage. Here are the chances that it will 
    | happen on a given request. By default, the odds are 2 out of 100. 
    | 
    */ 

    'lottery' => [2, 100], 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Cookie Name 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may change the name of the cookie used to identify a session 
    | instance by ID. The name specified here will get used every time a 
    | new session cookie is created by the framework for every driver. 
    | 
    */ 

    'cookie' => 'geeksquad_form_session', 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Cookie Path 
    |-------------------------------------------------------------------------- 
    | 
    | The session cookie path determines the path for which the cookie will 
    | be regarded as available. Typically, this will be the root path of 
    | your application but you are free to change this when necessary. 
    | 
    */ 

    'path' => '/', 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Cookie Domain 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may change the domain of the cookie used to identify a session 
    | in your application. This will determine which domains the cookie is 
    | available to in your application. A sensible default has been set. 
    | 
    */ 

    'domain' => '.'.config('app.domain'), 

    /* 
    |-------------------------------------------------------------------------- 
    | HTTPS Only Cookies 
    |-------------------------------------------------------------------------- 
    | 
    | By setting this option to true, session cookies will only be sent back 
    | to the server if the browser has a HTTPS connection. This will keep 
    | the cookie from being sent to you if it can not be done securely. 
    | 
    */ 

    'secure' => false, 

]; 

Если есть что-нибудь еще, что было бы полезно, дайте мне знать.

ответ

4

Наконец-то дошел до сути проблемы.

Это должно было быть связано с этой строкой в ​​файле конфигурации session.php.

'domain' => '.'.config('app.domain')

Эта линия получает домен из config.php файла, который в свою очередь, получает его из файла .env.

Ubuntu и Locally in Homestead, который также является Ubuntu, работает безупречно.

Однако на Red Hat это не работает вообще. Изменение линии должно быть 'domain' => '.'.env('APP_DOMAIN') и вуаля все в порядке с миром, и TokenMissmatch ушел.

+0

Чтобы предотвратить ошибку, вы должны использовать csrf_token внутри формы. csrf_token дает вам дополнительную защиту от различных атак. –

+0

Я действительно верю, что вы не прочитали весь вопрос. Выведенный код формы является шаблоном «лезвие» и использует созданный «HTML/Form», который был удален из «Laravel 5», этот авто генерирует '_token ', когда вы используете' Form :: open' Я также разместил ответ. –

+0

Лично я использую laravel 5, и я прошел через проблему, поэтому я дал вам решение. Например, Laravel генерирует csrf_token, но вы должны включить его в форму, чтобы при публикации данных laravel проверяет csrf_token, чтобы убедиться, что он из правильного источника и не управляется через другие источники. Neways, кроме этого, у меня нет другого решения. –