Ajax授权请求头一再失败

7

我正在开发一个自制API的客户端,但在设置授权头部信息(Authorization header)方面遇到了严重困难。我使用JQuery进行Ajax请求,但'beforeSend'根本不起作用(使用fiddler检查请求)。

这是我的beforeSend代码:

    $.ajax({
     type: "GET",
     url: url+"/Projects",
     contentType: "application/json; charset=utf-8",
     beforeSend: function (req) {
        req.setRequestHeader("Authorization", AuthBuilder(username, password));
     },
     success: function (result) {
        alert("success");
     },
     error: function (xhr, ajaxOptions, thrownError) {
        alert("fail");
     }
 });

如果失败了怎么办?返回旧的方式发送ajax请求...但这也不起作用...
以下是我通常的代码:
function GET(address, callback, error) {
Request = getXMLHttpObject();
Request.open("GET", url + address, true);

var base64 = Base64.encode(username + ":" + password);
alert(base64);
Request.setRequestHeader("Authorization", "Basic " + base64);

Request.send();
Request.onreadystatechange = function () {
    //alert(Request.readyState+" code "+Request.status);
    if (Request.readyState == 4 && Request.status == 200) {
        callback(jQuery.parseJSON(Request.responseText));
    } else if (Request.readyState == 4 && Request.status >= 400) {
        error(Request.status, Request.statusText);
    }
} 
}

不要介意我没有特别要求返回json,因为服务默认返回json。其他信息如下:
  • 源不重要,服务允许所有来源(已经测试和确认)
  • 当通过头设置时,授权有效(在其他客户端中测试过)
  • 授权标头只是未发送
  • AuthBuilder(用户名,密码))给出了基本授权标头内容的正确格式
  • getXMLHttpObject()只是一些复制粘贴的代码,在此之前可以正常工作
有什么想法吗?
1个回答

1

我找到了问题所在。自制服务将“Access-Control-Allow-Headers”作为全局标头发送回客户端,其中只包含“Content-Type”。

这样,我们的客户端如果不使用用户代理(浏览器),就会忽略这些标头并仍然发送标头。但是浏览器尝试优化请求并说:“它不接受授权标头,因此在发送之前我将削减它。” 这样包就更小了,服务也不会允许它(尽管它确实允许...)

因此,只需将“Authorization”添加到服务的“Access Control Allow Headers”部分即可使我的Javascript / JQuery / Ajax请求正常发送请求标头!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接