在标头中发送令牌时,Laravel TokenMismatch Exception

Posted

技术标签:

【中文标题】在标头中发送令牌时,Laravel TokenMismatch Exception【英文标题】:Laravel TokenMismatch Exception when sending token in header 【发布时间】:2018-11-27 06:25:30 【问题描述】:

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

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

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

我已经在 chrome 开发者工具中检查了这个标头正在被发送。

但是 Laravel 仍然会抛出 TokenMismatch 异常。

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

【问题讨论】:

【参考方案1】:

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

现在的问题是“X-CSRF-TOKEN”标头用于发送csrf_token()函数生成的令牌。

因此,如果您想发送从 cookie 获得的 csrf 令牌,您应该使用“X-XSRF-TOKEN”标头。

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

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

【讨论】:

【参考方案2】:

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

将此添加到您的刀片文件中的<head></head>

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

在你的 JS 中得到这样的令牌:

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

-- 编辑--

如果您不想使用 meta 标记,可以使用输入字段,并将其放入您的 &lt;body&gt;&lt;/body&gt;

<input type="hidden" name="csrf-token" value=" csrf_token() ">

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

【讨论】:

由于某种原因,我无法使用元标记获取 csrf 令牌【参考方案3】:

我也遇到了像你这样的问题;也许这个答案会有所帮助..看起来您的 csrf 令牌已更新:https://***.com/a/43893114/5586645

【讨论】:

以上是关于在标头中发送令牌时,Laravel TokenMismatch Exception的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ajax 标头中为每个用户发送 api 令牌?

无法修改标头信息 - 标头已在 Laravel AngularJS 中发送

授权标头未到达 laravel 项目中的服务器

在请求的标头中发送令牌是不是安全?

从 Lumen 获得授权,从 Laravel 获得标头

使用护照Laravel创建令牌时出现异常