2015-02-23 86 views
6

看起来jQuery不会在POST请求(或其他类型)之前发送OPTIONS请求时沿Authorization标头发送消息。我试图达到的服务器返回了OPTIONS请求的401状态 - 我如何强制jQuery包含Authorization标题,即使在这个初始请求中?jQuery.ajax不会发送带有OPTIONS请求的授权标头

$.ajax({ 
    type: "POST", 
    url: url, 
    data: postData, 
    beforeSend: function ajaxBeforeSend(jqXHR) { 
     jqXHR.withCredentials = true; 
     jqXHR.setRequestHeader("Authorization", "Basic " + btoa(encodeURIComponent(escape($username.val())) + ":" + encodeURIComponent(escape($password.val())))); 
    }, 
    success: runReportUrlCallback, 
    error: runReportErrorCallback 
}); 

我也尝试添加usernamepassword到AJAX选项,但无济于事。

+0

可能的重复[为什么在Chrome浏览器中运行经过身份验证的CORS请求的预检OPTIONS请求,而不是Firefox?](http://stackoverflow.com/questions/15734031/why-does-the-preflight-options-request -of-an-authenticated-cors-request-in-in) – suish 2015-02-23 05:48:20

+0

看起来像是让服务器不需要对OPTIONS请求进行认证是修复它的唯一方法。 – suish 2015-02-23 05:49:54

+0

我不“拥有”服务器。这是第三方网络服务。 – 2015-02-23 05:52:24

回答

3

看来,没有考虑OPTIONS请求,第三方服务器配置不正确。

W3指出预检OPTIONS请求必须:

排除用户凭据。

用户凭证被定义:

术语用户证书对于本说明书的目的而言是指饼干,HTTP认证,和客户端的SSL证书

参见https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

如果服务器在您的控制之下,那么您只需将OPTIONS请求处理程序放在auth检查之前。

如果服务器不在您的控制范围内(这似乎是这种情况),那么您向服务器管理员呻吟,说明他们做错了,并希望他们改变它。

相关问题