VerifyCsrfToken.php第67行中的TokenMismatchException

问题描述 投票:48回答:35

我知道这是Laravel中形式之类的已知错误。但是我在Laravel 5.2中遇到了基本身份验证的问题。

我用Laravel创建了auth;

php artisan make:auth

现在我在我的服务器和本地代码上都有相同的代码副本。在我当地,我没有任何问题。但是在我的服务器上,当我尝试注册用户时,我收到错误说TokenMismatchException in VerifyCsrfToken.php Line 67

我的本地和服务器环境都是同步的,但我在注册时一直收到错误。有关如何解决此问题的任何帮助?

Screenshot of Error

laravel-5.2
35个回答
70
投票

我假设您在控制器的构造函数中添加了$this->middleware('auth');以使身份验证正常工作。在您的登录/注册表单中,如果您使用的是{!! Form::someElement !!},请在顶部添加以下行:

{!! csrf_field() !!}

或者如果您在表单中使用输入标记,只需在<form>标记后添加以下行:

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

希望这可以帮助。


3
投票

我也得到了这个错误,但我解决了这个问题。如果你使用php artisan serve{{ csrf_field() }}下添加此代码{!! Form::open() !!}

  1. php artisan cache:清楚
  2. 清除缓存和cookie浏览器
  3. 使用私人浏览器(Mozilla)/隐身窗口(Chrome)
  4. 打开表单/页面,然后再次提交

我希望这能解决你的问题。


3
投票

确保

{!! csrf_field() !!}

在您的表单中添加了刀片语法。

或者以简单的形式语法

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

与此同时,请确保在session.php(在配置文件夹中)中正确设置了以下内容。

'domain' => env('SESSION_DOMAIN', 'sample-project.com'),

或者在.env文件中更新相同的内容,

SESSION_DOMAIN=sample-project.com

在我的情况下{!! csrf_field()!!}已正确添加,但未正确配置SESSION_DOMAIN。在我的.env文件中使用正确的值更改后,它工作正常。


2
投票

将session.php中的会话驱动程序更改为文件我的设置为数组。


2
投票

如果'www-data'用户对该文件夹没有访问/写入权限,也会发生:'laravel-project-folder'/ storage / framework / sessions /


2
投票

以下为我工作。

<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">

1
投票

您是否检查过生成令牌的隐藏输入字段?

如果它为null,则csrf_token函数不会返回您的令牌。您必须编写路由,以便通过laravel提供中间件组内的表单,如下所示:

  Route::group(['middleware' => 'web'], function () {
Route::get('/', function () {
    return view('welcome');
});

这里的根路由包含我的注册页面,需要csrf令牌。此令牌由kernel.php中的“web”中间件内的laravel 5.2.7管理。

别忘了插入{!! csrf_field()!!}在表单内..


1
投票

默认情况下,如果浏览器具有HTTPS连接,则会话cookie将仅发送回服务器。您可以在.env文件中将其关闭(不鼓励生产)

SESSION_SECURE_COOKIE=false

或者你可以在config / session.php中关闭它

'secure' => false,

1
投票

app/provides

然后,在文件RouteServiceProvider.php中,你将不得不删除'middleware' => 'web'中的protected function mapWebRoutes(Router $router)


1
投票

将此代码放在<form></form>标记之间:

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

0
投票

我遇到了同样的问题,但我通过更正我的表格来解决它,如下所示:

{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}

如果这不能解决您的问题,请告诉您如何打开表格?


12
投票

我有一个类似的问题,这是一个简单的解决方案。

将其添加到HTML元标记区域:

 <meta name="csrf-token" content="{{ csrf_token() }}">

然后在您的JQuery参考下,添加以下代码:

<script type="text/javascript">
      $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
      });
  </script>

如果您使用HTML表单提交(而不是AJAX),那么您需要:

{{ csrf_field() }} 

在您的表单标签内。


0
投票

你应该试试这个。

在表单开始标记之后添加{{csrf_field()}},就像这样。

<form method="POST" action="/your/{{ $action_id }}">
{{ csrf_field() }}    

0
投票

你是否在帖子后重定向?我有这个问题,我能够通过返回相同的视图而不是使用Redirect :: back()来解决它。

使用此返回视图() - > with(),而不是Redirect :: back()。


0
投票

对我来说,我必须使用安全的https而不是http。


0
投票

尝试在config/session.php上更改会话生存期,如下所示:

'lifetime' => 120,'lifetime' => 360,

在这里我将生命设置为360,希望对此有所帮助。


0
投票

上传大文件(视频)时出现此错误。表单工作正常,没有不匹配错误,但只要有人附加了大型视频文件,就会抛出此令牌错误。调整最大允许文件大小和增加处理时间为我解决了这个问题。不知道为什么Laravel会在这种情况下抛出这个错误,但这里有一个更有潜力的解决方案。

这是一个StackOverflow答案,详细介绍了如何解决大文件上传问题。

PHP change the maximum upload file size


0
投票

在我的情况下,我在重新启动服务器后尝试登录时出现问题,但是我在表单中有csrf字段而且我没有刷新页面,或者它在缓存中出现了问题。

这是我的解决方案。我把这段代码放在\ App \ Http \ Middleware \ VerifyCsrfToken.php中

public function handle($request, Closure $next)
{
    try {
        return parent::handle($request, $next); // TODO: Change the autogenerated stub
    } catch(TokenMismatchException $e) {
        return redirect()->back();
    }
}

它的作用是捕获TokenMismatchException,然后将用户重定向回页面(在头文件和字段中重新加载csrf标记)。它可能不会一直有效,但它适用于我的问题。


0
投票

尝试php artisan cache:清除或手动删除服务器的存储缓存。


0
投票

如果您检查Laravel 5.4中的一些默认表单,请填写以下内容:

<form class="form-horizontal" role="form" method="POST" action="{{ route('password.email') }}">
  {{ csrf_field() }}

  <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
    <label for="email" class="col-md-4 control-label">E-Mail Address</label>

    <div class="col-md-6">
      <input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required> @if ($errors->has('email'))
      <span class="help-block">
                                        <strong>{{ $errors->first('email') }}</strong>
                                    </span> @endif
    </div>
  </div>

  <div class="form-group">
    <div class="col-md-6 col-md-offset-4">
      <button type="submit" class="btn btn-primary">
                                    Send Password Reset Link
                                </button>
    </div>
  </div>
</form>

{{ csrf_field() }}

是添加Laravel将理解的自定义隐藏字段的最合适方式。

csrf_filed()在里面使用csrf_token(),你可以看到:

if (! function_exists('csrf_field')) {
    /**
     * Generate a CSRF token form field.
     *
     * @return \Illuminate\Support\HtmlString
     */
    function csrf_field()
    {
        return new HtmlString('<input type="hidden" name="_token" value="'.csrf_token().'">');
    }
}

并且csrf_field()方法使用会话进行工作。

function csrf_token()
{
    $session = app('session');

    if (isset($session)) {
        return $session->token();
    }

    throw new RuntimeException('Application session store not set.');
}

0
投票

当我第一次尝试Laravel 5.2时,我遇到同样的问题,然后我了解到{{!! csrf_field() !!}}将被添加到表单中并解决了它。但后来我了解了Form Helpers,它负责CSRF保护并且不会出现任何错误。虽然在Laravel 5.2之后不能合法地使用Form Helpers,但您仍然可以在LaravelCollective中使用它们。


0
投票

您可以通过删除该行来解决。转到app \ http \ kernel.php,在这里你可以看到行\ App \ Http \ Middleware \ VerifyCsrfToken :: class,这对我有用。


9
投票

您需要在HTML文档的部分中使用这行代码,默认情况下可以这样做,它不会造成任何伤害:

<meta name="csrf-token" content="{{ csrf_token() }}" />

在您的表单中,您需要添加此隐藏的输入字段:

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

多数民众赞成,为我工作。


0
投票

我的问题是php.ini中的post_max_size值很小。


9
投票

我正准备拔出头发!

请在session.php配置中检查您的会话cookie域。有一个域选项必须与您的环境相匹配,并且最好使用.env文件进行配置以进行开发。

'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),

8
投票

如果没有任何工作,您可以通过转到App / Http / Middleware / VerifyCsrfToken.php文件并将您的路由添加到protected $ excpt来删除CSRF安全检查。

例如如果我想从所有路线中删除CSRF保护。

protected $except = [
    '/*'
];

P.S虽然是一个很好的做法,包括CSRF保护。


7
投票

我在laravel 5.4上运行的应用程序遇到了同样的问题

php artisan session:table
php artisan make:auth
php artisan migrate

..然后以下命令为我工作:)

chmod 777 storage/framework/sessions/

如果您将SESSION_DOMAIN(在.env中)设置为与HOST_NAME不同,则会出现此问题的另一种可能性

快乐的编码


5
投票

我也遇到了同样的问题并在以后解决了。首先执行artisan命令:

php artisan cache:清楚

然后重启项目。希望它会有所帮助。


5
投票

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

'domain' => null,

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


4
投票

您的表单方法是post。因此,打开Middleware / VerifyCsrfToken .php文件,找到isReading()方法并在数组中添加“POST”方法。

© www.soinside.com 2019 - 2024. All rights reserved.