Laravel TokenMismatch在标头

时间:2018-06-18 11:52:37

标签: php laravel cookies laravel-5.3 csrf-protection

我在发送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。

3 个答案:

答案 0 :(得分:1)

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

将其添加到您的刀片文件中的json

data

在你的JS中得到这样的标记:

r = requests.post(url, headers=headers, json=data)

- 修改 -

如果您不想使用<head></head>标记并将其放在<meta name="csrf-token" content="{{ csrf_token() }}">

中,则可以使用输入字段
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').val()
    }
});

答案 1 :(得分:1)

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

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

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

因此上面的代码应该像

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

答案 2 :(得分:0)

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