使用XHR进行基本身份验证

时间:2012-10-12 05:02:08

标签: authentication curl http-headers jqxhr

我正在尝试从我的服务器获得一些需要基本身份验证的响应。所以当我使用curl时:

curl -u user:pass http://myserver.com/get/send-my-data

它给了我正确的答复。 但是当我使用jquery AJAX创建XHR请求时。我有403错误。 这是我的AJAX设置:

            $.ajax ({
            type: 'GET',
            url: 'http://myserver.com/get/send-my-data',
            beforeSend: function(xhr) {
                xhr.setRequestHeader("Authorization", "Basic" + encode64(user:pass)); // I have calculated base64 encoded value of user:pass correctly.
            },
            success: function(d) { console.log(d); },
            crossDomain: 'true'
        });

我有403回复。以下是使用-v选项从curl获取的请求标头。

> POST /get/send-my-data HTTP/1.1
**> Authorization: Basic ********** // Removed original code deliberately**
> User-Agent: curl/7.27.0
> Host: localhost:8080
> Accept: */*
> Content-Length: 264
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------3c0e06f1e2b4

这是从我的XHR请求的查尔斯获得的标题

OPTIONS /get/send-my-data HTTP/1.1
Host    10.40.55.110:4502
Access-Control-Request-Method   GET
Origin  http://localhost:8080
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML,     like Gecko) Chrome/22.0.1229.79 Safari/537.4
**Access-Control-Request-Headers    origin, authorization, accept**
Accept  */*
Referer http://localhost:8080/proof/check.html
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.3

我无法理解为什么会这样?为什么我的XHR请求标头没有显示如curl标头中所示的授权标头。请说明我做错了。

PS:这是一个跨域请求。

1 个答案:

答案 0 :(得分:3)

我遇到了这个问题,因为我发送了跨域请求并请求使用POST方法。因此,当我们在跨域服务器上进行POST时,会出现一个概念预检

在Preflight中,它只发送选项标题并告诉资源将要命中哪个请求。然后服务器决定发送请求是否安全。

然后如果服务器发送OK,则发送实际请求。 可能这些行会更加明确。

  

预检请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送。       跨站点请求是这样预检的,因为它们可能对用户数据有影响。特别是,如果出现以下情况,请求会被预检:

     

它使用GET,HEAD或POST以外的方法。此外,如果使用POST来发送具有除application / x-www-form-urlencoded,multipart / form-data或text / plain之外的Content-Type的请求数据,例如,如果POST请求使用application / xml或text / xml向服务器发送XML有效负载,则该请求将被预检。

     

它在请求中设置自定义标头(例如,请求使用标头,例如X-PINGOTHER)

Source: MDN CORS Documentation