我有一个在Laravel 5.3应用程序上使用AJAX的应用程序。我有一些页面落后于身份验证,有些页面不是。身份验证内部的工作正常。外面的人(面向公众)正在给我一个臭名昭着的TokenMismatchException in VerifyCsrfToken.php line 68
。为了将令牌附加到AJAX标头,我正在使用它......
$.ajaxSetup({
cache: false,
async: true,
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
...但令牌不匹配。当我转到框架文件Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class
并对会话令牌和传递的令牌执行dd()
时,它们不匹配。
我尝试过的事情:
csrf_field()
代替AJAX标题我无法弄清楚为什么这不起作用。还有其他想法吗?
答案 0 :(得分:0)
如果你看一下这段代码Github Link
/**
* Determine if the session and input CSRF tokens match.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function tokensMatch($request)
{
$sessionToken = $request->session()->token();
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
$token = $this->encrypter->decrypt($header);
}
if (! is_string($sessionToken) || ! is_string($token)) {
return false;
}
return hash_equals($sessionToken, $token);
}
它检查X-CSRF-TOKEN
并尝试检查X-XSRF-TOKEN
。您也可以尝试从ajax发送_token
。我希望这会对你有所帮助。
答案 1 :(得分:0)
而且,我终于明白了。我正在使用BrowserSync进行livereload,它将我的所有请求代理到localhost:3000/*
。当我测试公共端时,我通过原始域名访问它,而不是通过browsersync' localhost:3000
代理,因此导致会话问题。
基本上,如果您运行BrowserSync并尝试使用您的网站而不是通过browsersync,则可能会出现令牌不匹配错误。