VerifyCsrfToken.php第67行中的TokenMismatchException

amodi 发布于 2019-08-10 最后更新 2019-08-10 09:51 336 浏览

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

php artisan make:auth
现在我的服务器和本地代码都有相同的代码副本。在我的本地我没有任何问题。但是在我的服务器上,当我尝试注册用户时,出现TokenMismatchException in VerifyCsrfToken.php Line 67错误 我的本地和服务器环境都是同步的,但我一直在注册时发生错误。任何帮助我如何解决这个问题? Screenshot of Error
已邀请:

zsed

赞同来自:

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

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

taut

赞同来自:

在打开标记后输入此代码:

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

ret

赞同来自:

确保

{!! 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文件中使用正确的值更改后,它工作正常。

ysequi

赞同来自:

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

qodio

赞同来自:

我正要开始拔头发! 请在session.php配置中检查您的会话cookie域。有一个域选项必须与您的环境相匹配,这是一个很好的做法,可以使用.env文件进行配置以进行开发。

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

cnisi

赞同来自:

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

mut

赞同来自:

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

{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}
如果这不能解决您的问题,请告诉您如何打开表格?

dsed

赞同来自:

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

  1. php artisan cache:clear
  2. 清除缓存& cookies浏览器
  3. 使用私人浏览器(Mozilla)/隐身窗口(Chrome)
  4. 打开您的表单/页面,然后再次提交个人
我希望这能解决你的问题。

qanimi

赞同来自:

以下对我有用。

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

ut_sit

赞同来自:

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

protected $except = [
    '/*'
];
P.S虽然是一个很好的做法,包括CSRF保护。

znihil

赞同来自:

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

adolor

赞同来自:

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

ut_est

赞同来自:

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

SESSION_SECURE_COOKIE=false
或者你可以在config / session.php中关闭它
'secure' => false,

podio

赞同来自:

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

bea

赞同来自:

如果您查看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.');
}

wet

赞同来自:

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

<meta name="csrf-token" content="{{ csrf_token() }}" />
在您的表单中,您需要添加此隐藏的输入字段:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
多数民众赞成,为我工作。

bipsam

赞同来自:

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

adicta

赞同来自:

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

php artisan cache:clear
之后重启项目。 希望它会有所帮助。

but

赞同来自:

我有一个类似的问题,这是一个简单的解决方案。 在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() }} 
在表单标签内。

qui_id

赞同来自:

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

iullam

赞同来自:

请按照一个非常简单的步骤。您只需要评论app\http\kernel.php而不是app\kernel.php文件中的以下行:

\App\Http\Middleware\VerifyCsrfToken::class,
我希望,它会解决你的问题,让我知道它是否不起作用。

zomnis

赞同来自:

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

{!! csrf_field() !!}
或者,如果您在表单中使用输入标记,只需在<form>标记之后添加:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
干杯。

hquae

赞同来自:

如果'www-data'用户没有访问/写入权限,也会发生 在文件夹上: “laravel项目文件夹” /存储/框架/会话/

wearum

赞同来自:

您是否检查过生成令牌的隐藏输入字段? 如果它为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()!!}在表单内..

ueos

赞同来自:

namespace App \ Http \ Middleware; protected $ except = ['api / *'];

kalias

赞同来自:

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

eomnis

赞同来自:

在我的情况下,我在重新启动服务器后尝试登录时出现问题,但是我在表单中有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标记)。 它可能不会一直有效,但它适用于我的问题。

ysequi

赞同来自:

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

php artisan session:table
php artisan make:auth
php artisan migrate
..然后以下命令为我工作:)
chmod 777 storage/framework/sessions/
如果您将SESSION_DOMAIN(在.env中)设置为与HOST_NAME不同,则会出现此问题的另一种可能性 快乐的编码

bquos

赞同来自:

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

cet

赞同来自:

尝试在config/session.php上更改会话生命周期,如下所示: 'lifetime' => 120,'lifetime' => 360, 在这里我将寿命设置为360,希望对此有所帮助。

xet

赞同来自:

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

adicta

赞同来自:

转到app/provides。 然后,在文件RouteServiceProvider.php中,您必须删除protected function mapWebRoutes(Router $router)中的'middleware' => 'web'