如何使用凭据、HTTP授权(CORS)使XMLHttpRequest跨域?
我无法使用授权头发出跨域请求(使用Firefox进行测试)。我有一些请求在没有身份验证的情况下工作,但一旦我将如何使用凭据、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
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设置
我发现了几个可能导致此问题的问题:
访问控制允许原点
不能是通配符。最简单的方法是将请求的来源
头复制到此字段。完全不清楚为什么标准会禁止通配符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)