首页 > 解决方案 > Cookie 未由 Chrome 和 withCredentials 发送是真的

问题描述

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

我尝试了一个 netlog 查看器会话,但这似乎没有显示与 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: ...

标签: javascriptgoogle-chromehttpcookiescross-domain

解决方案


我通过设置withCredentialstrue“发送前”而不是“打开后”来使其工作。在调用inxhr.send()之前,xhr 对象的属性设置回为,即使它被设置为in 。 _httpSend()withCredentialsfalsetruexhr.open()

我仔细检查了这两个方法中的 xhr 对象是同一个对象,并且该属性实际上被设置为true每个方法内部。不知何故,在调用和withCredentials之间被重置了。所以我只是确保在发送请求之前将其设置为in 。xhr.openxhr.sendtruexhr.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 中被重置并且我无权访问。


推荐阅读