带有ajax登录的Laravel 5.0 TokenMismatchException
Posted
技术标签:
【中文标题】带有ajax登录的Laravel 5.0 TokenMismatchException【英文标题】:Laravel 5.0 TokenMismatchException with ajax login 【发布时间】:2015-11-02 01:08:11 【问题描述】:我正在 debian 7 服务器上使用 laravel 5.0、php 5.5 开发 Web 应用程序。
本网站允许用户通过登录模式(ajax 登录)登录。但是……
我不断收到此异常
TokenMismatchException in VerifyCsrfToken.php line 47
我知道关于 csrf_token() 的故事必须以表单和 X-CSRF-TOKEN 用于 ajax 发布。我已经尝试了所有方法,但仍然没有解决方案。
有趣的是,只有在您第一次访问该网站时才会发生这种情况,在主页或任何页面上直接访问。当您访问会员区时,laravel 会将您重定向到 auth 错误的主页,之后您将永远不会再收到 tokenmismatchexception,相同的登录模式就像阳光一样工作。
任何建议
更新:
代码如下:
在我已经包含 csrf_code() 的标题中:
<meta name="csrf-token" content=" csrf_token() ">
并在表单中(实际上是可选的,因为 X-CSRF-TOKEN 已经设置好了)
<input type="hidden" name="_token" value=" csrf_token() ">
路线:
Route::post('/login', ['as' => 'auth.login', 'uses' => 'Auth\AuthController@postSignin']);
VerifyCsrfToken.php 进行调试。
public function handle($request, Closure $next)
if ($this->isReading($request) || $this->tokensMatch($request))
return $this->addCookieToResponse($request, $next($request));
throw new TokenMismatchException;
public function tokensMatch($request)
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (!$token && $header = $request->header('X-XSRF-TOKEN'))
$token = $this->encrypter->decrypt($header);
\Clockwork::info($request->session()->token());
//\Clockwork::info(\Session::token());
\Clockwork::info($token);
//return StringUtils::equals($request->session()->token(), $token);
return StringUtils::equals(\Session::token(), $token);
Jquery Ajax 设置:
$.ajaxSetup(
headers:
'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
);
输出:
【问题讨论】:
"I have tried every thing"
。你试过什么?
覆盖句柄和tokensMatch方法,将$request->session()->token()更改为Session::token(),也在元标记中将csrf_token()替换为Session::token( ),但发布时仍然没有相同的令牌。
您是否将令牌添加到您的 ajax HTTP 发布请求中?
是的,通过日志我可以看到 $request->session()->token() 与同样由 laravel self 生成的 ajax 令牌不同。
好吧,看来您已经尝试了解决此问题的常用方法。如果没有看到任何代码,真的很难帮助你。我可以整天坐在这里问你问题,直到我们缩小范围,但是发布你的代码可以节省我们俩的时间。
【参考方案1】:
是的,终于修好了,原因是网站开头有两个空行。在我使用过的内容刀片中
@extends('layouts/main')...@show
用于显示布局。 @show 导致两个空行,删除 @show 并且空行消失了。无论出于何种原因,这会破坏网站上的所有 cookie,并且 Laravel 无法创建会话。
【讨论】:
【参考方案2】:您的所有代码都运行良好..
你可以试试这个...
$.ajaxSetup(
headers:
'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
);
在调用 jquery 文件后移动这段代码...
实际上,当页面加载时,运行此代码后加载 html dom。你应该这样做,你的这段代码应该在加载 html dom 之后运行。
我的网站也遇到了同样的问题。
【讨论】:
以上是关于带有ajax登录的Laravel 5.0 TokenMismatchException的主要内容,如果未能解决你的问题,请参考以下文章