Cookie 未由 Chrome 和 withCredentials 发送是真的



Chrome 选择不在 GET 请求中发送 Cookie 标头。 我正在覆盖XMLHTTPRequest,以便当库调用open()时,它会调用open()的原始实现,然后设置withCredentials = true

我尝试过使用网络日志查看器会话,但这似乎没有显示与 cookie 相关的项目。 我尝试了不同的绑定技术,但我认为这个问题与上下文无关this。 Cookie 在浏览器工具的"应用程序"下的 Cookie 列表中正常显示。域列为.mydomain.com

<script type="text/javascript">
   document.cookie = "ATOKEN="d=dflskdjflsdkfj=1,"; Version=1; Domain=.mydomain.com; expires=Tues, 23 Jul 2019 20:54:04 GMT; Path=/";
   // library makes request to a-subdomain.mydomain.com
   var originalXMLHttpRequest = XMLHttpRequest;
   XMLHttpRequest = function ()
   {
     var xhr     = new originalXMLHttpRequest();
     var _httpOpen = xhr.open.bind(xhr);
     xhr.open = function (method, url, flag)
     {
       _httpOpen(method, url, flag ? flag : true);
       if (url.indexOf('a-subdomain') >= 0)
       {
         xhr.withCredentials = true;
       }
     };
     return xhr;
   };
</script>

使用 Charles 代理查看 403 的请求,并注意 Cookie 标头不存在。 Cookie 标头应该与 Cookie 一起存在:...

我通过将withCredentials设置为"发送前"而不是"打开后"来true它的工作。 在调用_httpSend()之前的xhr.send(),xhr 对象的 withCredentials 属性被设置回 false,即使它在 xhr.open() 中被设置为true

我仔细检查了 xhr 对象在两个方法中是否是同一对象,并且该属性实际上在每个方法中都设置为true。 不知何故,withCredentials在呼叫xhr.openxhr.send之间被重置。所以我只是确保在发送请求之前将其设置为 true in xhr.send

<script type="text/javascript">
    document.cookie = 'ATOKEN="d=dflskdjflsdkfj=1,"; domain=.mydomain.com;';
    // library makes request to a-subdomain.mydomain.com
    var originalXMLHttpRequest = XMLHttpRequest;
    XMLHttpRequest = function ()
    {
      var xhr     = new originalXMLHttpRequest();
      var _httpOpen = xhr.open.bind(xhr);
      var _httpSend = xhr.send.bind(xhr);
      var _url;
      xhr.open = function (method, url, flag)
      {
        _url = url;
        _httpOpen(method, url, flag ? flag : true);
      };
      xhr.send = function (body)
      {
        if (_url && _url.indexOf('a-subdomain') >= 0)
        {
          xhr.withCredentials = true;
        }
        _httpSend(body);
      };
      return xhr;
    };
</script>

我不知道为什么此属性被重置,因为XMLHTTPRequest标准中的方法不涉及该属性。 也许它在我覆盖的第三方 Javascript 中被重置,我无法访问。

相关内容

  • 没有找到相关文章

最新更新