Laravel 5.1令牌在POST头令牌和会话中的令牌之间不匹配

时间:2015-08-02 05:25:34

标签: php laravel token mismatch

更新2: 它肯定会产生一个全新的会话&执行POST时的令牌。我的会话被设置为存储在文件中,我可以在发布后直接创建新会话。

我仍然无法找到理由。任何帮助表示赞赏!

更新: 在进一步跟踪问题后,我在class VerifyCsrfToken中发现验证是由protected function tokensMatch($request)

中的这行代码完成的
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

return Str::equals($request->session()->token(), $token);

我从初始页面加载中复制令牌(并检查其会话值)并且它们匹配。

Token in session & hidden (login Page first load)= wHszQpffJC0gIov17pd2ZbPqtdbFq7yZh3U2QlOe 

但是当POST发生并且进行比较时,令牌会有所不同。不知何故,会话中的令牌已被更改。我这样检查:

echo 'Token from request= ' . $token;
echo 'Token from session= ' . $request->session()->token();

我得到了这个:

Token from request= wHszQpffJC0gIov17pd2ZbPqtdbFq7yZh3U2QlOe 
Token from session= sfquUx6MhPaqdMR862kDZh8qYmpKDJ0Rbdghq1iA

我是在新的浏览器/登录尝试中执行此操作。为什么会话中的令牌与登录页面中的令牌不同?

原文问: 我在一个新的L5.1安装上得到上述错误,不能(阅读众多链接后)解决这个问题。我是Laravel的新手。感谢任何建议。

我的表单如下:

    @extends('admin.layouts.default')

    @section('content')

    <div id="form" class="login">

        <img src="{{ $logo }}" class="logo"/>

        @include('admin.partials.message')

        {!! Form::open(['url' => '/login', 'class'=>'form']) !!}

            <div class="form-group">

                {!! Form::label('email', 'Email:', ['class'=>'control-label']) !!}
                {!! Form::email('email', null, ['class'=>'form-control', 'id'=>'email', 'required'=>'1']) !!}

            </div>

            <div class="form-group">

                {!! Form::label('password', 'Password:', ['class'=>'control-label']) !!}
                {!! Form::password('password', ['class'=>'form-control', 'id'=>'password', 'required'=>'1']) !!}

            </div>

            <div class="form-group text-left">

                {!! Form::checkbox('remember',  '1', null, ['id'=>'remember']) !!}
                {!! Form::label('remember', 'Remember Me', ['class'=>'control-label']) !!}

            </div>

            <div class="form-group">

                {!! Form::submit('Sign In', ['class'=>'btn btn-primary']) !!}

                <a href="/reset-password" class="text-muted">Forgot Your Password?</a>

            </div>

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

    </div>

    <?php dd(session()); ?>
@stop

我的路线看起来像这样:

   /*
    |--------------------------------------------------------------------------
    | Freely available routes for login, registration, password reset etc
    |--------------------------------------------------------------------------
    */
    Route::group([
        'middleware' => 'guest'
    ], function(){

        // Register
        Route::get('register', ['uses' => 'RegistrationController@create', 'as' => 'registration.create']);
        Route::post('register', ['uses' => 'RegistrationController@store', 'as' => 'registration.create']);

        // Activate
        Route::get('register/activate/{uuid}', ['uses' => 'RegistrationController@activate', 'as' => 'registration.activate']); // Pattern matched

        // Login/logout
        Route::get('login', ['uses' => 'Auth\AuthController@getLogin', 'as' => 'session.create']);
        Route::post('login', ['uses' => 'Auth\AuthController@postLogin', 'as' => 'session.create']);
        Route::get('logout', ['uses' => 'Auth\AuthController@getLogout', 'as' => 'session.destroy']);

        // Forgot password
        Route::get('reset-password', ['uses' => 'SessionController@reset_password', 'as' => 'session.reset_password']);

        // Change password
        Route::get('change-password', ['uses' => 'SessionController@change_password', 'as' => 'session.change_password']);
    });

页面加载和会话上的标记看起来一样,由formBuilder生成。

会话:

 #attributes: array:1 [▼
        "_token" => "EE5qv7mhhyI0cutpXOgU6jgvUR2R58RubQ5pC128"
      ]

页面HTML:

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

1 个答案:

答案 0 :(得分:2)

嗯,问题是我在secure文件中将会话变量true设置为www/config/session.php。这导致Laravel期望通过我的开发环境未设置的HTTPS请求,从而导致服务器将每个GETPOST视为新请求。

希望这有助于某人。