我无法在Firefox中进行带有授权头的跨域请求。我可以进行不需要身份验证的请求,但是一旦我将withCredentials设置为true,就无法再读取来自服务器的响应。
在服务器上,我使用Flask中的after_request
方法发送这些标头:
resp.headers['Access-Control-Allow-Origin'] = '*'
resp.headers['Access-Control-Allow-Credentials'] = 'true'
resp.headers['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
resp.headers['Access-Control-Allow-Headers'] = 'Authorization'
Firefox 从未实际进行 OPTIONS 调用。在客户端,我会发起一个 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
,则日志语句将在控制台记录期望的信息。然而,一旦我设置了这个值,xhr就不允许访问,我只会写一个0值和一个空字符串。我没有在这里设置授权标头,但这不应该影响我读取结果的能力。
如果我尝试向"open"命令添加用户名/密码,我会收到NS_ERROR_DOM_BAD_URI: Access to restricted URI denied
错误。
我做错了什么?
Origin
标头复制到Access-Control
响应标头”需要您验证和清理该标头,并根据允许的来源白名单进行检查(除非您真的希望使用带凭据的Access-Control-Allow=*,但没有人会想要这样做)。另一方面,盲目地复制Origin可能会引入严重的漏洞,并且使用不安全的字符串机制复制有效的Origin也可能会这样做。 - jjmontes