如何使用凭据、HTTP授权(CORS)使XMLHttpRequest跨域?

如何使用凭据、HTTP授权(CORS)使XMLHttpRequest跨域?,http,xmlhttprequest,cors,Http,Xmlhttprequest,Cors,我无法使用授权头发出跨域请求(使用Firefox进行测试)。我有一些请求在没有身份验证的情况下工作,但一旦我将with credentials设置为true,我就无法再从服务器读取响应 在服务器上,我发回这些头(使用Flask中的after\u request方法): Firefox从未真正进行过任何选项调用。在客户端上,我进行XMLHttpRequest调用: var xhr = new XMLHttpRequest() xhr.open( 'POST', 'http://test.local

我无法使用授权头发出跨域请求(使用Firefox进行测试)。我有一些请求在没有身份验证的情况下工作,但一旦我将
with credentials
设置为true,我就无法再从服务器读取响应

在服务器上,我发回这些头(使用Flask中的
after\u request
方法):

Firefox从未真正进行过任何选项调用。在客户端上,我进行XMLHttpRequest调用:

var xhr = new XMLHttpRequest()
xhr.open( 'POST', 'http://test.local:8002/test/upload', true)
xhr.withCredentials = true
xhr.onreadystatechange = function() {
    console.log( xhr.status, xhr.statusText )
}
xhr.send(fd)
如果没有
withCredentials
set,log语句将把期望的信息记录到控制台。一旦我设置了这个值,xhr就不允许访问,我只写了一个0值和一个空字符串。我没有在这里设置授权头,但这不会影响我读取结果的能力

如果我试图向“open”命令添加用户名/密码,我会得到一个
NS\u错误\u DOM\u坏的\u URI:Access to restricted URI denied
错误

我做错了什么?

我已经有了完整的CORS设置

我发现了几个可能导致此问题的问题:

  • 如果正在使用凭据,
    访问控制允许原点
    不能是通配符。最简单的方法是将请求的
    来源
    头复制到此字段。完全不清楚为什么标准会禁止通配符
  • Firefox缓存访问控制结果,即使您清除了缓存(可能是针对会话)。重新启动迫使它执行一个新的
    OPTIONS
    请求。为了帮助调试,我添加了标题
    访问控制最大年龄:1
  • open
    命令的用户名/密码显然不能用作凭据。您必须自己添加
    授权
    标题<代码>xhr.setRequestHeader('Authorization'、'Basic'+btoa(user+':'+pass))

  • 总的来说,拥有凭证的
    系统相当死板。只需编写一个服务器,将授权作为请求主体的一部分,就更容易了。

    我发现处理请求的唯一方法是:

    • 通过将自动验证逻辑移动到代码(例如从Apache到PHP),禁用选项方法请求的自动验证
    • 使用jQuery
      ajax
      调用
      withCredentials
    $.ajax({
    键入:“POST”,
    xhrFields:{
    证书:正确
    },
    ...
    });
    
    令人惊讶的是,如果我只是设置为
    true
    它不起作用:

    $.ajax({
    键入:“POST”,
    发送前:函数(jqxhr){
    jqxhr.withCredentials=true;//这不起作用
    },
    ...
    });
    
    非常感谢!在过去的一周里,我一直在与CORS和用户授权作斗争。一旦我读了你的答案,我决定做我自己的用户授权。工作起来很有魅力。是的,“脑死亡”是一个非常贴切的描述。
    var xhr = new XMLHttpRequest()
    xhr.open( 'POST', 'http://test.local:8002/test/upload', true)
    xhr.withCredentials = true
    xhr.onreadystatechange = function() {
        console.log( xhr.status, xhr.statusText )
    }
    xhr.send(fd)