使用XMLHttpRequest获取需要基本授权的跨源(CORS)资源

时间:2018-06-13 21:22:36

标签: javascript https cors xmlhttprequest http-status-code-401

标题很好地总结了基本请求/上下文。我正在尝试使用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

0 个答案:

没有答案