L5随机令牌不匹配异常


L5 random TokenMismatchExceptions

我在Laravel 5中得到了随机的TokenMismatchExceptions。在tokensMatch()函数中使用以下代码,我一直在尝试调试这个奇怪的问题:

Log::debug($request->session()->token(). ', ' . $token);

输出如下:

[2015-03-21 17:04:22] local.DEBUG: XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT, XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT  
[2015-03-21 17:04:34] local.DEBUG: XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT, XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT  
[2015-03-21 17:04:36] local.DEBUG: snE0IERJ1VY0o4qmSMuHb4wH9lhQUf5ZtVObOFnR, XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT  
[2015-03-21 17:04:36] local.ERROR: exception 'Illuminate'Session'TokenMismatchException' in vendor'laravel'framework'src'Illuminate'Foundation'Http'Middleware'VerifyCsrfToken.php:47
Stack trace:
[...]
[2015-03-21 17:07:30] local.DEBUG: XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT, XJhAXXQumM0JLX9tFcQn1tQZMI1FtglDFuhi8abT

如您所见,前2个请求成功,第3个请求失败,第4个请求再次成功。我一直在使用Fiddler和Chrome网络工具,我可以确认所有请求的数据都发送到了服务器。

因此,服务器端的令牌似乎发生了变化。奇怪的是,会话文件中的令牌似乎没有改变,错误的令牌总是一个我以前从未见过的字符串,但总是以某种方式恢复到原始字符串。

这种情况经常发生,所以真的很烦人。起初,我认为这可能是数据库会话驱动程序的问题,但我现在正在使用文件驱动程序,而且这种情况仍在发生。

更新

我一直有这个问题。我在不同的PC和使用php artisan serve的不同项目上都有它。我在不同的服务器和不同的项目上也有它(nginx1.6.2,php5.6.7)

我不是唯一一个有这个问题的人。

调试非常困难,因为它是随机发生的,有时它在一段时间内没有出现,然后突然连续发生多次,或者只有一次。通过简单地重新提交POST请求,它有时会再次工作,有时会导致另一个异常。

我在所有项目中唯一添加到composer.json的是"illuminate/html": "5.*"。所有composer包都是最新的。

一旦我有更多关于这个非常奇怪的问题的信息,我会尽快更新这个问题。

另一次更新

我创建了一个新的L5项目,并添加了一些最小的代码来重现这个错误。我所做的更改可以在这里看到(以及完整的测试项目)。我现在就试着调试这个项目。

这是Laravel 5中一些用户已知的问题。

这里有一张关于这个主题的Github公开发行票:https://github.com/laravel/framework/issues/8172

原因尚不清楚,而且已经持续了一段时间。有很多聪明人在研究它,但这个问题的明显随机性使调试变得困难。

我建议你把你的信息贡献给那张票,并密切关注那里的进一步信息。