Laravel 5 Auth Post Submit - VerifyCsrfToken.php 第 46 行中的 TokenMismatchException

Posted

技术标签:

【中文标题】Laravel 5 Auth Post Submit - VerifyCsrfToken.php 第 46 行中的 TokenMismatchException【英文标题】:Laravel 5 Auth Post Submit - TokenMismatchException in VerifyCsrfToken.php line 46 【发布时间】: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 个字节),并且服务器似乎没有这个长度有问题。 【参考方案1】:

我今天也遇到了同样的情况,突然我的应用程序开始向我显示该消息...

我刚刚重新启动了我的服务器,一切都恢复正常了。

【讨论】:

【参考方案2】:

我刚开始删除线:

'Illuminate\Foundation\Http\Middleware\VerifyCsrfToken'

来自 /app/Http/Resquests/Kernel.php。但是,这意味着 CSRF token check 将被删除,这意味着您的网站将不会受到跨站点请求伪造的保护。

更新 根据the documentation,您应该通过将此 sn-p 添加到您的代码中来将 CSRF 令牌添加到您的表单中:

<input type="hidden" name="_token" value=" csrf_token() ">

我在移动应用程序的后端服务中使用了第一种方式,但我发现我可以在请求中发送发送 CSRF 标头。

【讨论】:

但是这样做安全吗? 那真是个坏主意。 @LoveAndHappiness 这确实不安全,并且会让您面临一个经常被利用的漏洞:en.wikipedia.org/wiki/Cross-site_request_forgery 这不安全.... 您应该使用下面 Organic Advocate 提到的 csrf_field() 。 但是如果响应来自第三个 api 怎么办。例如,在我的情况下,我使用的是 paytm,并且在回调 url 中发布参数即将到来,但这个错误即将到来,因此我无法进行进一步的处理。【参考方案3】:

解决了这个问题:

当我检查 app.blade csrf-token 在删除它并添加 &lt;meta content="authenticity_token" name="csrf-param"&gt; 后在那里像 &lt;meta content="9DB/rSl5JKAkQenkfGLj4o/x6+1dIDC5m52IWJxjFfo=" name="csrf-token"&gt; 一样硬编码时,解决了我的问题。

【讨论】:

【参考方案4】:

只需注销并重新登录,这是唯一的方法 这是一个未知的错误,即使我有时会在我的表单发布中得到它,但是 论坛里的所有人,他们都说把 但这并不能解决问题 只需注销并重新登录

【讨论】:

这对我有用。即使我认为我已经注销了,我还是强制注销(通过访问我的注销 URL)并解决了问题。【参考方案5】:

根据文档可能是为什么:

将 CSRF 令牌插入表单

<input type="hidden" name="_token" value=" csrf_token() ">

【讨论】:

【参考方案6】:

这就是我要解决此问题的方法。

Assume that your web server has already write access to session directory, in my case 'app/storage/framework/sessions/'.

Execute,

$ rm -f your_web_app/storage/framework/sessions/*

Reload web in your browser and try to login again.

【讨论】:

【参考方案7】:

如果您使用刀片模板,您可以在表单中使用 put

 csrf_field() 

而不是

<input type="hidden" name="_token" value=" csrf_token() ">

它在 Laravel 5.1 中与我一起工作。

【讨论】:

【参考方案8】:

如果您想摆脱 VerifyCsrfToken.php 中的 TokenMismatchException,请查看此链接以获取 @Tariq Khan 的简单解决方案: TokenMismatchException in VerifyCsrfToken.php

【讨论】:

我实际上使用了@Luis Morales 解决方案。来自同一个问题。【参考方案9】:

检查您的routes.php 文件。我也遇到了这个错误,结果证明是由顶部的空行引起的(就在开头的&lt;?php 标签之前)。如此愚蠢的错误,希望这可以帮助某人。

【讨论】:

大声笑,经过半天的研究和调试,一个空行是导致如此愚蠢的错误的原因。谢谢!【参考方案10】:

我遇到了同样的问题。我通过更改 config/session.php 中的以下行来解决它

'domain' => env('DOMAIN', 'yourdomainnamehere.co.uk'),

然后在你的.env中添加以下行

DOMAIN=null

【讨论】:

【参考方案11】:

我遇到了同样的问题,我的解决方案是

<form method="POST" action="path_to_action">
    <input type="hidden" name="_token" value=" csrf_token() ">
    <input type="text" name="some_name">
</form>

【讨论】:

嗨,谢谢伙计!它解决了我的错误。但我只是想知道,我应该把这个&lt;input type="hidden" name="_token" value=" csrf_token() "&gt; 放在我的所有输入表单字段中吗? 抱歉回复晚了,不,您不需要为POST的所有输入表单字段,您只需为每个
输入一次【参考方案12】:

有很多可能导致这个问题。 我的经验是,这可能是 session.php 配置文件配置错误的问题。 你有没有改变过你的 session.php 配置文件? 可能是您将域的值从 null 更改为您的站点名称或 session.php 中的其他任何内容

'域' => null,

此文件中的错误配置会导致此问题。

【讨论】:

【参考方案13】:

我遇到了同样的问题,正在运行 php artisan config:cache

解决了所有问题。

我希望这对某人有所帮助

【讨论】:

你能详细解释一下你的答案吗?【参考方案14】:

尝试 php artisan route:list 并检查 id web 中间件是否重复。 例如(网络、网络、其他)。

在 Laravel 5.3 web 中间件是默认激活的,我已经添加了

Route::group(['middleware' => 'web'], function ()  ALL MY ROUTE );

生成了这个 TokenMismatch。

修复路线为我解决了问题。

欲了解更多信息,请参阅Question on Laracast

【讨论】:

【参考方案15】:

如果你想在表单中使用 CSRF,那么你必须在表单中添加这一行

 <input type="hidden" name="_token" value=" csrf_token() ">

如果你对使用 CSRF 不感兴趣,那么你必须在 kernel.php 文件的下面一行注释

//\App\Http\Middleware\VerifyCsrfToken::class,

【讨论】:

【参考方案16】:

可能与您的应用程序域设置有关。

    检查 config/session.php 中的“域”设置。 将其设置为“localhost”或与您的应用关联的正确域。 保存文件

我的是从 env 文件中提取的,并且该应用位于不同的域中。

希望这会为某人节省一些脑细胞。

【讨论】:

【参考方案17】:
<script>
function closedLogo() 
             
          $.ajax(
                  url: 'route('core.closed-logo')',
                  type: 'post',
                  success: function (data) 
                      $('#return').html(data);
                  
                 );
          
</script>

【讨论】:

【参考方案18】:

有趣的是,我最近遇到了类似的问题。我发现我的 Laravel 5.1 应用程序生成了两个不同的令牌。我通过生成新的应用程序密钥 [php artisan key:generate] 解决了这个问题!

【讨论】:

【参考方案19】:

转到名为 ... VrifyCsrfToken.php 的文件。位于app/Http/Middleware/

文件夹。

并改变以下......

命名空间 App\Http\Middleware;

使用 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken 作为 BaseVerifier;

类 VerifyCsrfToken 扩展 BaseVerifier

protected $except = [
    "*" .   //make * here . as is did.
];

【讨论】:

以上是关于Laravel 5 Auth Post Submit - VerifyCsrfToken.php 第 46 行中的 TokenMismatchException的主要内容,如果未能解决你的问题,请参考以下文章

POST 路由未从根路径 Laravel 5.2 中列出

Laravel AJAX Request Post 错误代码:使用 laravel auth 登录时会话 ID 更改后的 419

在 Laravel auth 中,该路由不支持 POST 方法。支持的方法:GET、HEAD

laravel5.5授权系统

Laravel 5.6 上的 Ajax 身份验证重定向

如何在laravel 5.5中使用令牌从JWTAuth获取用户