9

需要从 javascript(在 www.domain1.com 中)使用 Basic Auth 进行 REST GET 调用。REST API 在 domain2.com 中。REST API 返回 CORS 特定的 HTTP 标头。我需要支持 IE、Chrome 和 Firefox。下面的 JavaScript 进一步解释了这个问题——</p>

  1. 没有基本身份验证(在 IE 10、Chrome 和 Firefox 中工作,通过 XDomainRequest 对象处理较旧的 IE)

    var xhr = new XMLHttpRequest();
    xhr.open(method, url, true);
    
  2. 使用基本身份验证(仅在 IE 10 中有效,在 Chrome 和 Firefox 中失败)

    var xhr = new XMLHttpRequest();
    xhr.open(method, url, true, username, password);
    
  3. 使用基本身份验证(在 Chrome 和 Firefox 中失败)

    var xhr = new XMLHttpRequest();
    xhr.open(method, url, true);
    xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password));
    xhr. withCredentials = “true”;
    
  4. 使用基本身份验证(在 Chrome 和 Firefox 中失败)

    $.ajax({
    type: 'GET',
    url: jsonp_url,
    dataType: "json",
    username: username,
    password: pwd,
    beforeSend: function (xhr) {xhr.withCredentials = true; },
    success: function (result) { },
    error: function (xhr, ajaxOptions, thrownError) {
    }
    

    我很想在这里找到一个可以在 Chrome 和 FireFox 中使用 Basic Auth 的解决方案

4

1 回答 1

9

它得到了解决。注意到浏览器通过 Authentication 分两步进行跨域调用 - 在实际请求之前进行预检调用。此预检调用的性质在 IE 和 [Chrome + Firefox] 中有所不同。IE 进行 HTTP GET 预检调用并返回 401,然后在实际请求中发送身份验证详细信息。但是,Chrome 和 Firefox 采用更安全的方法,通过 HTTP OPTIONS 调用来检查 Web 服务器支持的所有内容作为 CORS(允许哪些域/是否支持 GET / POST 等),下一个调用与实际的 HTTP GET 请求一起进行带身份验证。

不幸的是,API 端的编码方式是对每个 Http 调用进行身份验证。这就是为什么即使是 HTTP OPTIONS 调用也返回 401。 [chrome + Firefox] 在预检调用之后立即抛出异常。

在 API 方面,修改代码以在 OPTIONS 调用的情况下不返回 401 并开始工作。

于 2014-01-09T20:18:18.190 回答