【发布时间】:2015-05-06 16:48:47
【问题描述】:
刚刚在 Laravel 5 中创建了一个新应用,但我在使用开箱即用的身份验证时遇到了一些问题...
我不断收到:VerifyCsrfToken.php 第 46 行中的 TokenMismatchException: 在提交登录或注册表单时...
我可以在登录表单页面上看到隐藏表单字段中的令牌代码和当时的会话是相同的......
作为测试,我也尝试过其他一些帖子建议注释掉 //'App\Http\Middleware\VerifyCsrfToken',在app/Http/kernal.php中看看会发生什么。每次提交表单后,我都会收到一条消息,指出重定向到:/auth/login 或 /auth/register,具体取决于我来自哪里,但没有成功。
奇怪的是,当我第一次安装框架时,它正在工作。从那以后我所做的就是运行一些迁移并设置我的一些模型和控制器,并使用一些用户数据为数据库播种。
更新:
如果我这样做,请在 VerifyCsrfToken.php 第 55 行的函数 tokensMatch() 中进一步研究:
var_dump($request->session()->token());
var_dump($request->input('_token'));
我可以看到这两个令牌是不同的,但使用的形式是:
var_dump(Session::all());
{{{ csrf_token() }}}
它们是一样的。 Session 令牌在到达 VerifyCsrfToken.php 的第 55 行的函数 tokensMatch() 之前已经改变了一些方式
我的堆栈跟踪如下:
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
【问题讨论】:
-
这是标准表单帖子还是您使用的是 ajax?
-
我已通过再次安装框架并复制所有模型、视图、控制器、迁移和种子文件并重新添加作曲家包来解决问题。仍然不确定问题的实际原因是什么,但是重新安装,然后我又走了......我保留了旧的代码库,所以如果有人有任何想法,我仍然渴望为面临同样问题的其他人找到答案..
-
如果您登陆的页面具有使用令牌的表单,并且长时间未提交表单,从而导致令牌过期,或者时钟开启,也会发生这种情况您的计算机已关闭。
-
使用 PHP 7.1.7 及其内置的 Web 服务器 (
php artisan serve=>php -S server.php),并面临相同(或类似)的问题。 cookie 没有完成脚本,它被切断了大部分(但不是全部!)页面请求。通过记录$_SERVER['HTTP_COOKIE']的长度并观察(使用代理 - “Fiddler”)浏览器发送的实际 cookie(没关系),发现了这一点。如果它在表单发布请求中被切断,会话会丢失令牌,它会重新生成并且与从表单传入的不匹配。 -
所以,这似乎是一个问题,至少部分是由 Web 服务器引起的,在我的情况下,它是 PHP 的内置服务器。但是,我无法使用仅输出接收到的 cookie 而不执行任何其他操作的简化服务器来重现这一点——在这种简单的情况下,它返回的 cookie 是正确的,即使它与 Laravel 的应用程序遇到的问题完全相同。在我的情况下,解决方法是不在同一域上使用任何其他应用程序(我删除了管理员的 cookie 部分),从而将 cookie 减少了大约 200 个字节(到 1050 个字节),并且服务器似乎没有这个长度有问题。