标题很好地总结了基本请求/上下文。我正在尝试使用JavaScript来使用XMLHttpRequest
检索网络资源。请求是跨域的,因此我使用CORS。资源也通过HTTPS(使用基本身份验证)生成,因此我必须发送该身份验证标头。
就我能告诉而言,我已经正确设置了所有内容,但我显然错过了一些东西,因为我仍然找回预检的响应有无效的HTTP状态代码401。
我不知道为什么。
我的JS代码如下:
var url = <MyURL>;
var xhr = new XMLHttpRequest();
xhr.open( 'GET', url, true );
xhr.withCredentials = true;
xhr.setRequestHeader( 'Authorization', 'Basic ' + window.btoa( <MyUsername> + ':' + <MyPassword> ) );
xhr.onreadystatechange = function() {
console.log( 'readyState: ' + xhr.readyState + ', status: ' + xhr.status );
if (xhr.readyState == 4) {
if (xhr.status == 200) {
document.getElementById( 'filecontent' ).value = 'HTTP 200 Success:\n' + xhr.responseText;
} else if (xhr.status == 401) {
document.getElementById( 'filecontent' ).value = 'HTTP 401 Unauthorized:\n' + x.getAllResponseHeaders();
} else if (xhr.status == 0) {
document.getElementById( 'filecontent' ).value = 'CORS failed.';
}
}
}
xhr.send( null );
Chrome报告的请求/响应标头如下。 (我正在Python SimpleHTTPServer
会话中运行代码,这样我实际上可以拥有一个不是 null 的原点,只是为了安全起见。)
Request/Response Headers for XMLHttpRequest (transcript below)
一切看起来对吗?请求Origin
标头与响应Access-Control-Allow-Origin
标头(http://127.0.0.1:9000
)匹配。 Access-Control-Allow-Methods
标题包含OPTIONS
,这是我正在制作的请求方法(因为这是预检阶段)。
但是状态代码仍然以401 Unauthorized
的形式返回(甚至没有传回XMLHttpRequest
对象,该对象只看到状态:= 0,并尝试运行任何类型getResponseHeader()
调用只返回 null )。
对于它的价值,这是控制台输出。 (除了OPTIONS
调用返回401 Unauthorized
这一事实之外,并不是很有趣,然后我使用前面提到的Response for preflight has invalid HTTP status code 401.
得到无法加载&lt; MyURL&gt; )
Console output for XMLHttpRequest
“显而易见”的答案似乎是用户名/密码错误,但如果我直接从网址栏发出请求,它就有效(当输入相同的用户名和密码时),这样就不会似乎是这样。唯一的区别是它不需要进行预检请求(因为它不需要处理CORS)。
所以我觉得我在这里遗漏了一些明显的东西,但是呃......有帮助吗?
标题的成绩单:
常规
Request URL: <MyURL>
Request Method: OPTIONS
Status Code: 401 Unauthorized
Remote Address: <MyIP>:443
Referrer Policy: no-referrer-when-downgrade
响应标题
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: null
Connection: keep-alive
Content-Length: 606
Content-Type: text/html
Date: Wed, 13 Jun 2018 21:04:09 GMT
Server: nginx/1.10.3 (Ubuntu)
WWW-Authenticate: Basic realm="<MyRealm>"
请求标题
Provisional headers are shown
Access-Control-Request-Headers: authorization
Access-Control-Request-Method: GET
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36