VerifyCsrfToken.php 第 67 行中的 TokenMismatchException
TokenMismatchException in VerifyCsrfToken.php Line 67
我知道这是 Laravel 中表单之类的已知错误。但是我在 Laravel 5.2 中遇到基本身份验证问题。
我使用 Laravel;
创建了授权
php artisan make:auth
现在我的服务器和本地都有相同的代码副本。在我的本地,我没有遇到任何问题。但是在我的服务器上,当我尝试注册用户时,出现 TokenMismatchException in VerifyCsrfToken.php Line 67
错误
我的本地环境和服务器环境都是同步的,但我一直收到注册错误。关于如何解决此问题的任何帮助?
我假设您在控制器的构造函数中添加了 $this->middleware('auth');
以使身份验证正常工作。在您的 login/register 表单中,如果您使用的是 {!! Form::someElement !!}
,请在顶部添加以下行:
{!! csrf_field() !!}
或者,如果您在表单中使用输入标签,只需在 <form>
标签后添加以下行:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
希望对您有所帮助。
您是否检查了生成令牌的隐藏输入字段?
如果它为空,则 csrf_token 不会返回您的令牌 function.You 必须编写您的路由,以在 laravel 提供的中间件组内呈现表单,如下所示:
Route::group(['middleware' => 'web'], function () {
Route::get('/', function () {
return view('welcome');
});
这里的根路由包含我的注册页面,它需要 csrf 令牌。此令牌由 kernel.php 中 'web' 中间件内的 laravel 5.2.7 管理。
不要忘记插入{!! csrf_field() !!} 在表格内..
我遇到了同样的问题,但我通过更正打开的表单解决了这个问题,如下所示:
{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}
如果这不能解决您的问题,能否请您展示一下您是如何打开该表格的?
我也遇到了同样的问题,后来解决了。
首先执行 artisan 命令:
php artisan cache:clear
然后重启项目。
希望它会有所帮助。
您需要在 HTML 文档的部分中包含这行代码,您可以默认这样做,它不会造成任何伤害:
<meta name="csrf-token" content="{{ csrf_token() }}" />
并且在您的表单中,您需要添加这个隐藏的输入字段:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
就是这样,对我有用。
您的表单方法是post。所以打开 Middleware/VerifyCsrfToken .php 文件,找到 isReading() 方法并在数组中添加 'POST' 方法。
我都快要拔头发了!
请检查 session.php 配置中的会话 cookie 域。有一个域选项必须与您的环境相匹配,最好使用您的 .env 文件进行配置以进行开发。
'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),
如果没有任何效果,您可以通过转到 App/Http/Middleware/VerifyCsrfToken.php 文件并将您的路由添加到受保护的 $excpt.
来删除 CSRF 安全检查
例如如果我想从所有路由中删除 CSRF 保护。
protected $except = [
'/*'
];
P.S 尽管包含 CSRF 保护是一个很好的做法。
你应该试试这个。
像这样在您的表单开始标记之后添加 {{ csrf_field() }}。
<form method="POST" action="/your/{{ $action_id }}">
{{ csrf_field() }}
我遇到了类似的问题,很容易解决。
将此添加到您的 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() }}
在您的表单标签内。
您是否在 post 之后将其重定向回来?我遇到了这个问题,我能够通过 returning 相同的视图而不是使用 Redirect::back().
来解决它
使用此 return view()->with(),而不是 Redirect::back()。
导致此问题的可能性有很多种。
让我提一个。
您是否偶然更改了 session.php 配置文件?
可能是您已将域的值从 null 更改为您的站点名称或 session.php
中的任何其他内容
'domain' => null,
此文件中的错误配置可能会导致此问题。
将 session.php 中的会话驱动程序更改为我的文件设置为数组。
对我来说,我必须使用安全的 https 而不是 http。
请按照非常简单的步骤操作。您只需在 app\http\kernel.php
而不是 app\kernel.php
文件中注释以下行:
\App\Http\Middleware\VerifyCsrfToken::class,
希望它能解决您的问题,如果它不起作用,请告诉我。
我也遇到了这个错误,不过问题已经解决了。如果您使用 php artisan serve
,请在 {!! Form::open() !!}
下添加此代码 {{ csrf_field() }}
- php artisan cache:clear
- 清除缓存和 cookie 浏览器
- 使用私人浏览器 (Mozilla)/隐身 Window (Chrome)
- 打开你的 form/page 然后再次提交
希望这能解决您的问题。
如果 'www-data' 用户没有 access/write 权限,也会发生
在文件夹上:
'laravel-project-folder'/storage/framework/sessions/
尝试像这样更改 config/session.php
上的会话生命周期:
'lifetime' => 120,
到 'lifetime' => 360,
这里我把lifetime设置成360,希望对你有帮助。
默认情况下,只有当浏览器具有 HTTPS 连接时,会话 cookie 才会被发送回服务器。你可以在你的 .env 文件中关闭它(不鼓励生产)
SESSION_SECURE_COOKIE=false
或者您可以在 config/session 中将其关闭。php
'secure' => false,
上传大文件(视频)时出现此错误。表单工作正常,没有不匹配错误,但是一旦有人附加了一个大视频文件,它就会抛出这个标记错误。调整最大允许文件大小并增加处理时间为我解决了这个问题。不确定为什么 Laravel 在这种情况下会抛出此错误,但这里为您提供了另一种可能的解决方案。
这是 Whosebug 的回答,其中更详细地介绍了如何解决大文件上传问题。
PHP change the maximum upload file size
就我而言,我在重新启动服务器后尝试登录时遇到了问题,但我在表单中有 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,然后将用户重定向回页面(在 header 和字段中重新加载 csrf 令牌)。
它可能并不总是有效,但它对我的问题有效。
尝试 php artisan cache:clear 或从服务器手动删除存储缓存。
下面对我有用。
<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
我在 laravel 5.4
上的申请 运行 遇到了同样的问题
php artisan session:table
php artisan make:auth
php artisan migrate
.. 然后下面的命令对我有用:)
chmod 777 storage/framework/sessions/
如果您将 SESSION_DOMAIN(在 .env 中)设置为与 HOST_NAME
不同,则存在此问题的另一种可能性
编码愉快
如果您检查 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.');
}
我一开始尝试 Laravel 5.2 时遇到了同样的问题,然后我了解到要在表单中添加 {{!! csrf_field() !!}}
并解决了这个问题。但后来我了解到 Form Helpers,它负责 CSRF 保护并且不会给出任何错误。尽管在 Laravel 5.2 之后无法合法使用表单助手,但您仍然可以在 LaravelCollective.
之后使用它们
namespace App\Http\Middleware;
protected $except = ['api/*'];
转到app/provides
。
然后,在文件 RouteServiceProvider.php
中,您必须删除 protected function mapWebRoutes(Router $router)
中的 'middleware' => 'web'
删除该行即可解决。转到 app\http\kernel.php,在这里您可以看到行 \App\Http\Middleware\VerifyCsrfToken::class,这对我有用。
确保
{!! csrf_field() !!}
以 blade 语法添加到您的表单中。
或简单形式语法
<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 文件中用正确的值更改它后,它起作用了。
将此代码放在 <form>
和 </form>
标记之间:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
我的问题是 php.ini 中的 post_max_size 值太小了。
已进入您的 laravel 文件夹 :: App/http/Middleware/VerifyCsrfToken.php
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
// Pass your URI here. example ::
'/employer/registration'
];
}
并且它将 url 从 Csrf 验证中排除。适合我。
output_buffering=4096;
always_populate_raw_post_data=-1;
upload_max_filesize=120M;
在 public_html 中创建 user.ini 文件并将以上三个值放入 user.ini 文件中
解决了我的问题
这样使用
<form>
<input type="hidden" name="_token" value="<?= csrf_token(); ?>" />
我曾经遇到过这个异常,我是这样解决的:浏览到您的项目目录并从 app\Http\Middleware\ 目录打开 VerifyCsrfToken.php。并在提供的数组中列出导致异常的 URI(路由)。
protected $except = [
//list your routes here
];
我知道这是 Laravel 中表单之类的已知错误。但是我在 Laravel 5.2 中遇到基本身份验证问题。
我使用 Laravel;
创建了授权php artisan make:auth
现在我的服务器和本地都有相同的代码副本。在我的本地,我没有遇到任何问题。但是在我的服务器上,当我尝试注册用户时,出现 TokenMismatchException in VerifyCsrfToken.php Line 67
我的本地环境和服务器环境都是同步的,但我一直收到注册错误。关于如何解决此问题的任何帮助?
我假设您在控制器的构造函数中添加了 $this->middleware('auth');
以使身份验证正常工作。在您的 login/register 表单中,如果您使用的是 {!! Form::someElement !!}
,请在顶部添加以下行:
{!! csrf_field() !!}
或者,如果您在表单中使用输入标签,只需在 <form>
标签后添加以下行:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
希望对您有所帮助。
您是否检查了生成令牌的隐藏输入字段?
如果它为空,则 csrf_token 不会返回您的令牌 function.You 必须编写您的路由,以在 laravel 提供的中间件组内呈现表单,如下所示:
Route::group(['middleware' => 'web'], function () {
Route::get('/', function () {
return view('welcome');
});
这里的根路由包含我的注册页面,它需要 csrf 令牌。此令牌由 kernel.php 中 'web' 中间件内的 laravel 5.2.7 管理。
不要忘记插入{!! csrf_field() !!} 在表格内..
我遇到了同样的问题,但我通过更正打开的表单解决了这个问题,如下所示:
{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}
如果这不能解决您的问题,能否请您展示一下您是如何打开该表格的?
我也遇到了同样的问题,后来解决了。 首先执行 artisan 命令:
php artisan cache:clear
然后重启项目。 希望它会有所帮助。
您需要在 HTML 文档的部分中包含这行代码,您可以默认这样做,它不会造成任何伤害:
<meta name="csrf-token" content="{{ csrf_token() }}" />
并且在您的表单中,您需要添加这个隐藏的输入字段:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
就是这样,对我有用。
您的表单方法是post。所以打开 Middleware/VerifyCsrfToken .php 文件,找到 isReading() 方法并在数组中添加 'POST' 方法。
我都快要拔头发了!
请检查 session.php 配置中的会话 cookie 域。有一个域选项必须与您的环境相匹配,最好使用您的 .env 文件进行配置以进行开发。
'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),
如果没有任何效果,您可以通过转到 App/Http/Middleware/VerifyCsrfToken.php 文件并将您的路由添加到受保护的 $excpt.
来删除 CSRF 安全检查例如如果我想从所有路由中删除 CSRF 保护。
protected $except = [
'/*'
];
P.S 尽管包含 CSRF 保护是一个很好的做法。
你应该试试这个。
像这样在您的表单开始标记之后添加 {{ csrf_field() }}。
<form method="POST" action="/your/{{ $action_id }}">
{{ csrf_field() }}
我遇到了类似的问题,很容易解决。
将此添加到您的 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() }}
在您的表单标签内。
您是否在 post 之后将其重定向回来?我遇到了这个问题,我能够通过 returning 相同的视图而不是使用 Redirect::back().
来解决它使用此 return view()->with(),而不是 Redirect::back()。
导致此问题的可能性有很多种。 让我提一个。 您是否偶然更改了 session.php 配置文件? 可能是您已将域的值从 null 更改为您的站点名称或 session.php
中的任何其他内容'domain' => null,
此文件中的错误配置可能会导致此问题。
将 session.php 中的会话驱动程序更改为我的文件设置为数组。
对我来说,我必须使用安全的 https 而不是 http。
请按照非常简单的步骤操作。您只需在 app\http\kernel.php
而不是 app\kernel.php
文件中注释以下行:
\App\Http\Middleware\VerifyCsrfToken::class,
希望它能解决您的问题,如果它不起作用,请告诉我。
我也遇到了这个错误,不过问题已经解决了。如果您使用 php artisan serve
,请在 {!! Form::open() !!}
{{ csrf_field() }}
- php artisan cache:clear
- 清除缓存和 cookie 浏览器
- 使用私人浏览器 (Mozilla)/隐身 Window (Chrome)
- 打开你的 form/page 然后再次提交
希望这能解决您的问题。
如果 'www-data' 用户没有 access/write 权限,也会发生 在文件夹上: 'laravel-project-folder'/storage/framework/sessions/
尝试像这样更改 config/session.php
上的会话生命周期:
'lifetime' => 120,
到 'lifetime' => 360,
这里我把lifetime设置成360,希望对你有帮助。
默认情况下,只有当浏览器具有 HTTPS 连接时,会话 cookie 才会被发送回服务器。你可以在你的 .env 文件中关闭它(不鼓励生产)
SESSION_SECURE_COOKIE=false
或者您可以在 config/session 中将其关闭。php
'secure' => false,
上传大文件(视频)时出现此错误。表单工作正常,没有不匹配错误,但是一旦有人附加了一个大视频文件,它就会抛出这个标记错误。调整最大允许文件大小并增加处理时间为我解决了这个问题。不确定为什么 Laravel 在这种情况下会抛出此错误,但这里为您提供了另一种可能的解决方案。
这是 Whosebug 的回答,其中更详细地介绍了如何解决大文件上传问题。
PHP change the maximum upload file size
就我而言,我在重新启动服务器后尝试登录时遇到了问题,但我在表单中有 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,然后将用户重定向回页面(在 header 和字段中重新加载 csrf 令牌)。 它可能并不总是有效,但它对我的问题有效。
尝试 php artisan cache:clear 或从服务器手动删除存储缓存。
下面对我有用。
<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
我在 laravel 5.4
上的申请 运行 遇到了同样的问题php artisan session:table
php artisan make:auth
php artisan migrate
.. 然后下面的命令对我有用:)
chmod 777 storage/framework/sessions/
如果您将 SESSION_DOMAIN(在 .env 中)设置为与 HOST_NAME
不同,则存在此问题的另一种可能性编码愉快
如果您检查 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.');
}
我一开始尝试 Laravel 5.2 时遇到了同样的问题,然后我了解到要在表单中添加 {{!! csrf_field() !!}}
并解决了这个问题。但后来我了解到 Form Helpers,它负责 CSRF 保护并且不会给出任何错误。尽管在 Laravel 5.2 之后无法合法使用表单助手,但您仍然可以在 LaravelCollective.
namespace App\Http\Middleware;
protected $except = ['api/*'];
转到app/provides
。
然后,在文件 RouteServiceProvider.php
中,您必须删除 protected function mapWebRoutes(Router $router)
'middleware' => 'web'
删除该行即可解决。转到 app\http\kernel.php,在这里您可以看到行 \App\Http\Middleware\VerifyCsrfToken::class,这对我有用。
确保
{!! csrf_field() !!}
以 blade 语法添加到您的表单中。
或简单形式语法
<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 文件中用正确的值更改它后,它起作用了。
将此代码放在 <form>
和 </form>
标记之间:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
我的问题是 php.ini 中的 post_max_size 值太小了。
已进入您的 laravel 文件夹 :: App/http/Middleware/VerifyCsrfToken.php
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
// Pass your URI here. example ::
'/employer/registration'
];
}
并且它将 url 从 Csrf 验证中排除。适合我。
output_buffering=4096;
always_populate_raw_post_data=-1;
upload_max_filesize=120M;
在 public_html 中创建 user.ini 文件并将以上三个值放入 user.ini 文件中 解决了我的问题
这样使用
<form>
<input type="hidden" name="_token" value="<?= csrf_token(); ?>" />
我曾经遇到过这个异常,我是这样解决的:浏览到您的项目目录并从 app\Http\Middleware\ 目录打开 VerifyCsrfToken.php。并在提供的数组中列出导致异常的 URI(路由)。
protected $except = [
//list your routes here
];