Laravel 在 header 中发送令牌时出现 TokenMismatch 异常

Laravel TokenMismatch Exception when sending token in header

我在发出 ajax 请求时在 header 中发送 CSRF 令牌。

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': getCookie("XSRF-TOKEN")
    }
});

在上面的代码中,我从“XSRF-TOKEN”cookie 获取令牌,并在“X-CSRF_TOKEN”header 中为所有 ajax 请求全局设置。

我已经在 chrome 开发者工具中检查到正在发送此 header。

但是Laravel仍然抛出TokenMismatch异常。

注意 我无法从 html 获取标记,例如元标记或输入字段,因为 html 内容正在被缓存,因此我想设置使用"XSRF-TOKEN" laravel 在每个响应中设置的 cookie。

尝试这样做: https://laravel.com/docs/5.3/csrf#csrf-x-csrf-token

将此添加到 blade 文件中的 <head></head>

<meta name="csrf-token" content="{{ csrf_token() }}">

然后在您的 JS 中像这样获取令牌:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').val()
    }
});

-- 编辑 --

如果您不想使用 meta 标签并将其放入您的 <body></body>

,则可以使用输入字段代替
<input type="hidden" name="csrf-token" value="{{ csrf_token() }}">

'X-CSRF-TOKEN': $('input[name="csrf-token"]').val()

我遇到了和你一样的问题;也许这个答案会有所帮助..看起来你的 csrf 令牌已更新:

Laravel的csrf_token()生成的token和cookie中设置的不一样。

现在的问题是 "X-CSRF-TOKEN" header 用于发送由 csrf_token() 函数生成的令牌。

因此,如果您想发送从 cookie 中获取的 csrf 令牌,您应该使用 "X-XSRF-TOKEN" header.

因此上面的代码应该是这样的

$.ajaxSetup({
    headers: {
        'X-XSRF-TOKEN': getCookie("XSRF-TOKEN")
    }
});