本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常

Posted

技术标签:

【中文标题】本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常【英文标题】:CSRF token mismatch exception in ajax post request in laravel 5.3 on localhost 【发布时间】:2017-06-12 21:06:58 【问题描述】:

我是 laravel 的新手。我在本地主机上使用 laravel 5.3,我正在使用 ajax 发布请求将数据发布到控制器功能。我已经像这样集成了 CSRF 令牌 在主模板的头部内

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

在包含 jquery 之后我添加了这个脚本

<script type="text/javascript">
    $( document ).ready(function() 
      $.ajaxSetup(
        headers: 
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        

      );
      console.log($('meta[name="csrf-token"]').attr('content'));
    );
  </script>

我正在像这样点击按钮发送数据

$.ajax(
    type: "POST",
    url: './add_to_cart',
    data: id:prod_id,name: name,price:price,
    success: function( msg ) 

    
);

第一次调用正确,没有错误。但是第一次调用后每次调用都会返回错误

VerifyCsrfToken.php 第 67 行中的 TokenMismatchException:

这是错误截图:

【问题讨论】:

【参考方案1】:

调用带有未单独包含的标头的 ajax 函数。 我相信你的元标签是这样的

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

喜欢这个

$.ajax(
    type: "POST",
    url: '/add_to_cart',
    headers: 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
    data: id:prod_id,name: name,price:price,
    success: function( msg ) 

    
);

所以每次ajax调用完成时,Header都会包含csrf_token()

【讨论】:

感谢 naveen 的回复。我已包含与您描述的相同的元标记。我已经尝试了您的解决方案,但仍然出现相同的错误。第一次调用没有错误,但之后它抛出异常。 我也检查了标头,每个请求都包含 csrf 令牌,但仍然不知道是什么问题 你能检查/add_to_cart路由是否有apiweb中间件。如果是网络,则可能是一个问题,因为令牌会随着每个 POST 请求而改变。将其更改为api。使用 Laravel 5.3 确保路由在 routes/api.php 文件中。 所有默认路由都应该在 web.php 中,除了 api 路由。 @ChrisCynarski。除非他在创建api,否则他不需要改变 @Chris Cynarski 我不是在创建 api,我正在开发网络。【参考方案2】:

我认为你应该试试这个:

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

$.ajax(
   type: "POST",
   url: './add_to_cart',
   headers: 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
   data: "_token": " csrf_token() ",id:prod_id,name: name,price:price,
   success: function( msg ) 

   
);

希望这对你有用!

【讨论】:

感谢大家的帮助,我已经尝试了所有提供的解决方案,但问题没有解决 @Naveen Kumar 我已经尝试了令牌正在生成的代码,但是给出令牌不匹配异常的响应看看在AJAX请求的chrome控制台截图screencast.com/t/gntfBMuhlLf 您的解决方案没有为令牌赋值 请看截图screencast.com/t/ptnBaziuruZ【参考方案3】:

在仔细检查了我的代码之后,我发现这段代码就是这样做的。 会话::flush();删除此问题后解决。 特别感谢大家的努力@Naveen Kumar

【讨论】:

【参考方案4】:

如果您使用 URL“http://localhost:8000/”访问发送数据的页面 将您用于发出请求的 url 更改为“http://localhost:8000/”

地址栏中的基本 url 和您用来发出请求的基本 url 应该相同。这个想法是发出请求的域必须与发出请求的网站的域相同。 CSRF攻击研究

【讨论】:

以上是关于本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常的主要内容,如果未能解决你的问题,请参考以下文章

无法让 Laravel 4 在本地主机上工作

在本地主机上运行 laravel 时出现内部服务器错误

Laravel 5.2 session flash 在本地主机上工作但在服务器上不工作?

Laravel JWT:本地主机上生成的令牌在服务器上有效

Vue 组件显示在本地主机上,但不在使用 Laravel 5.4 的服务器上:Passport

无法让本地主机上的 ajax 调用 require_once 工作