另一个Laravel Token Mismatch Exception问题

时间:2016-10-28 16:19:29

标签: ajax laravel

我有一个在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')
    }
});

它正在发挥作用,因为当我提出请求时,我可以看到...... enter image description here

...但令牌不匹配。当我转到框架文件Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class并对会话令牌和传递的令牌执行dd()时,它们不匹配。

我尝试过的事情:

  1. 清除缓存(视图,配置,缓存)
  2. 更改会话驱动程序 提交给Redis
  3. 使用csrf_field()代替AJAX标题
  4. 我无法弄清楚为什么这不起作用。还有其他想法吗?

2 个答案:

答案 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,则可能会出现令牌不匹配错误。