Laravel 5.1 POST header 令牌与 session 中的令牌不匹配
Laravel 5.1 Token mismatch between POST header token and token in session
更新 2:
它肯定会在执行 POST 时生成一个全新的 session & 令牌。我的 session 被设置为存储在文件中,我可以在发布后直接看到一个新的 session 被创建。
我仍然找不到原因。感谢您的帮助!
更新:
在进一步跟踪问题后,我在 class VerifyCsrfToken
中发现验证是由 protected function tokensMatch($request)
中的这行代码完成的
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
return Str::equals($request->session()->token(), $token);
我从初始页面加载复制令牌(并检查其 session 值)并且它们匹配。
Token in session & hidden (login Page first load)= wHszQpffJC0gIov17pd2ZbPqtdbFq7yZh3U2QlOe
但是当 POST
发生并比较它们时,标记是不同的。 session 中的标记已被更改。我这样检查:
echo 'Token from request= ' . $token;
echo 'Token from session= ' . $request->session()->token();
我明白了:
Token from request= wHszQpffJC0gIov17pd2ZbPqtdbFq7yZh3U2QlOe
Token from session= sfquUx6MhPaqdMR862kDZh8qYmpKDJ0Rbdghq1iA
我在全新的浏览器/登录尝试中执行此操作。为什么 session 中的令牌与登录页面携带的令牌不同?
原问题:
我在全新的 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']);
});
页面加载的令牌和 session 看起来一样,由 formBuilder 生成。
Session:
#attributes: array:1 [▼
"_token" => "EE5qv7mhhyI0cutpXOgU6jgvUR2R58RubQ5pC128"
]
第HTML页:
<input name="_token" type="hidden" value="EE5qv7mhhyI0cutpXOgU6jgvUR2R58RubQ5pC128">
好吧,原来的问题是我在 www/config/session.php
文件中将会话变量 secure
设置为 true
。这导致 Laravel 期望来自 HTTPS
的请求是我的开发环境尚未设置的,因此导致服务器将每个 GET
或 POST
视为新请求.
希望这对某人有所帮助。
更新 2: 它肯定会在执行 POST 时生成一个全新的 session & 令牌。我的 session 被设置为存储在文件中,我可以在发布后直接看到一个新的 session 被创建。
我仍然找不到原因。感谢您的帮助!
更新:
在进一步跟踪问题后,我在 class VerifyCsrfToken
中发现验证是由 protected function tokensMatch($request)
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
return Str::equals($request->session()->token(), $token);
我从初始页面加载复制令牌(并检查其 session 值)并且它们匹配。
Token in session & hidden (login Page first load)= wHszQpffJC0gIov17pd2ZbPqtdbFq7yZh3U2QlOe
但是当 POST
发生并比较它们时,标记是不同的。 session 中的标记已被更改。我这样检查:
echo 'Token from request= ' . $token;
echo 'Token from session= ' . $request->session()->token();
我明白了:
Token from request= wHszQpffJC0gIov17pd2ZbPqtdbFq7yZh3U2QlOe
Token from session= sfquUx6MhPaqdMR862kDZh8qYmpKDJ0Rbdghq1iA
我在全新的浏览器/登录尝试中执行此操作。为什么 session 中的令牌与登录页面携带的令牌不同?
原问题: 我在全新的 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']);
});
页面加载的令牌和 session 看起来一样,由 formBuilder 生成。
Session:
#attributes: array:1 [▼
"_token" => "EE5qv7mhhyI0cutpXOgU6jgvUR2R58RubQ5pC128"
]
第HTML页:
<input name="_token" type="hidden" value="EE5qv7mhhyI0cutpXOgU6jgvUR2R58RubQ5pC128">
好吧,原来的问题是我在 www/config/session.php
文件中将会话变量 secure
设置为 true
。这导致 Laravel 期望来自 HTTPS
的请求是我的开发环境尚未设置的,因此导致服务器将每个 GET
或 POST
视为新请求.
希望这对某人有所帮助。