【问题标题】:$.ajax gets a 419 only in safari, works fine with chrome and FF$.ajax 仅在 safari 中获得 419,适用于 chrome 和 FF
【发布时间】:2021-08-13 03:47:10
【问题描述】:

我在 laravel 刀片页面上有一个 ajax 调用。此 ajax 调用可在 Chrome 和 FF 上找到,但每次使用 safari 时都会失败,并显示 419。我已经尝试了堆栈上不同线程中提到的所有解决方案。

我最新的代码迭代如下面的代码所示。 (从 iframe 收到消息后发布)

    <script type="text/javascript">
    window.addEventListener('message', function messageListener(event) {
        var iframeUrl = "{{ \Config::get('app.nexio_url')}}";
        var token = "<?php echo session('_token'); ?>";
        if (event.origin === iframeUrl) {
            console.log('------->event.data', event.data);
            console.log('------->', '{{csrf_token()}}');
            if(event.data.event === 'processed'){
                $.ajax({
                  type: "POST",
                  url: "pay/paynow-nexio",
                  data: {'payment_data':event.data.data.id, '_token':'{{csrf_token()}}', 'response':event.data.data},
                  cache: false,
                  success: function(data){
                     if(data != '')
                     {
                        window.location.href = data;
                     }
                  }
                });
            }
        }
    });

</script>

我什至尝试添加

$.ajaxSetup({
      headers: { 'X-CSRF-Token' : '{{csrf_token()}}' }
});

我不知道下一步该尝试什么。感谢您的任何帮助

来自开发工具

Summary
URL: https://domain.dev/pay/paynow-nexio
Status: 419 unknown status
Source: Network
Initiator: 
jquery-1.9.1.min.js:5:17824


Request
POST /pay/paynow-nexio HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate, br
Host: domain.dev
Origin: https://domain.dev
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15
Referer: https://domain.dev/create-transaction
Content-Length: 5742
Connection: keep-alive
Cookie: laravel_session=EhFPvHN4zrpKASQTjBvHkbIytClmZ1RoAsUhGOip; XSRF-TOKEN=eyJpdiI6IllFakhzK1pkMjVyVE9QYTlDL2tZcVE9PSIsInZhbHVlIjoiQll1SjZpbU9aWVkvTUN4cldLWGI1akpTaFNWYVJpWWR4b1JzNFJvY0pGbWg4dEp3dVU4RTRFTGozcmZtc2k4eiIsIm1hYyI6ImRiNDRmN2QyNWJlNGNmODhjMGE0YTM2OTFhMWMzYzBmZWFjYzkxY2Q0Zjk5OWM2MjY3ODk4ZGNlMWM0YzEwZTUifQ%3D%3D
X-Requested-With: XMLHttpRequest
X-CSRF-Token: UBLZCBfBJwMOdieJZzEl09k2OBgwkBnG7pZchjW7

Response
HTTP/1.1 419 unknown status
Set-Cookie: laravel_session=EhFPvHN4zrpKASQTjBvHkbIytClmZ1RoAsUhGOip; expires=Fri, 20-Aug-2021 03:35:51 GMT; Max-Age=604800; path=/; domain=domain.dev; httponly; samesite=lax
Content-Type: application/json
Keep-Alive: timeout=5, max=100
Date: Fri, 13 Aug 2021 03:35:50 GMT
Content-Length: 41
Cache-Control: no-cache, private
Connection: Keep-Alive
Server: Apache/2.4.38 (Debian)
X-Powered-By: PHP/7.3.29

Request Data
MIME Type: application/x-www-form-urlencoded; charset=UTF-8
_token: UBLZCBfBJwMOdieJZzEl09k2OBgwkBnG7pZchjW7
---rest of form post data ---

【问题讨论】:

  • 你检查过 devtools 中的 POST,你能看到 CSRF 令牌真的被发送了吗?
  • 是的,正在发送 CSRF,谢谢
  • 我建议在进行任何验证之前,使用 dd() 重新检查您在发布数据中提供的数据。看来验证失败了
  • @TymurValiiev 谢谢你的评论。你是在端点建议 dd() 吗?我在函数的入口点放了一个回声,但它从来没有那么远。我怀疑它被框架更早地拒绝了。您对 dd() 的放置位置有什么建议吗?我刚刚继承了这个项目,并试图熟悉 laravel

标签: php jquery ajax laravel


【解决方案1】:

正如您已经猜到的那样,这是一个 Safari 错误。

https://laracasts.com/discuss/channels/laravel/session-expired-error-419-on-safari-1212-after-updating-to-laravel-7

sessions.php 上的same_site 设置有关

据我所知,唯一的解决办法是放松设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多