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

时间:2015-03-05 10:37:16

标签: php forms laravel-5

刚刚在Laravel 5中创建了一个新的应用程序,我在使用开箱即用的auth时遇到了一些麻烦......

我一直得到:VerifyCsrfToken.php第46行中的TokenMismatchException: 提交登录或注册表单......

我可以在登录表单页面上看到隐藏表单字段中的令牌代码和该点的Session是相同的......

作为测试,我也尝试过其他一些帖子建议发表评论 //'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() }}}

他们是一样的。会话令牌在它到达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

19 个答案:

答案 0 :(得分:25)

我首先让它正在删除该行:

'照亮\基金会\ HTTP \中间件\ VerifyCsrfToken'

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

<强>更新 根据{{​​3}},您应该通过将此代码段添加到代码中来将CSRF令牌添加到表单中:

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

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

答案 1 :(得分:10)

根据文件可能是原因:

将CSRF令牌插入表单

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

答案 2 :(得分:5)

我有同样的问题。我通过更改config / session.php

中的以下行来解决它
'domain' => env('DOMAIN', 'yourdomainnamehere.co.uk'),

然后在你的.env

中添加以下行
DOMAIN=null

答案 3 :(得分:4)

检查您的<?php文件。我也有这个错误,结果是由顶部的空白行(就在开始PATCH标记之前)引起的。这样一个愚蠢的错误,希望这可以帮助某人。

答案 4 :(得分:3)

我有同样的问题,我的解决方案是

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

答案 5 :(得分:2)

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

{{ csrf_field() }}

而不是

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

它在Laravel 5.1中与我合作。

答案 6 :(得分:1)

只需退出并以唯一的方式重新登录 这是一个未知的错误,即使我有时会在我的表单中发布它,但是 所有论坛中的人都会说出来 但这并没有解决问题 只需注销并重新登录

答案 7 :(得分:1)

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

答案 8 :(得分:0)

解决了这个问题:

当我检查app.blade时,csrf-token在删除此内容并<meta content="9DB/rSl5JKAkQenkfGLj4o/x6+1dIDC5m52IWJxjFfo=" name="csrf-token">添加<meta content="authenticity_token" name="csrf-param">之后就像{{1}}一样进行了硬编码。这可能有助于一些人:)

答案 9 :(得分:0)

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

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.

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

'domain'=&gt;空,

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

答案 12 :(得分:0)

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

解决了这一切。

我希望这有助于某人

答案 13 :(得分:0)

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

在Laravel 5.3默认情况下,Web中间件已激活,我已添加

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

生成了这个TokenMismatch。

修复路线为我解决问题。

有关详细信息,请参阅Question on Laracast

答案 14 :(得分:0)

如果您想在表单中使用CSRF,则必须在表单中添加此行

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

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

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

答案 15 :(得分:0)

可能是您的App Domain设置。

  1. 检查config / session.php中的“域名”设置。
  2. 将其设置为“localhost”或与您的应用关联的相应域。
  3. 保存文件
  4. 我从env文件中获取了该应用程序,该应用程序位于不同的域中。

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

goto文件名为... VrifyCsrfToken.php。位于app / Http / Middleware /

文件夹中。

并改变以下......

命名空间App \ Http \ Middleware;

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

类VerifyCsrfToken扩展了BaseVerifier {

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

}

答案 18 :(得分:-1)

<script>
function closedLogo() 
         {    
          $.ajax({
                  url: '{{route('core.closed-logo')}}',
                  type: 'post',
                  success: function (data) {
                      $('#return').html(data);
                  }
                 });
          }
</script>