在预检中使用HTTP 401的Ajax CORS请求

时间:2017-06-24 11:29:31

标签: javascript ajax cors http-error

我现在正在努力工作几个小时。我想向另一个域发出一个简单的ajax请求,但始终得到http 401错误:

jQuery(document).ready(function($){
  var challengeid = $('#codepressHook').data('challengeid');
  var clicked = false;
  $('#codepressHook').click(function(){
    if(!clicked){
      $.ajax({
        url: "https://dev.radbonus.com/admin/affiliate-connections/retrieveSingle/"+challengeid+".json",
        method: "GET",
        dataType: "json",
        jsonp: false,
        contentType: "application/json",
        xhrFields: {
          withCredentials: true
        },
        beforeSend: function(xhr){
          xhr.setRequestHeader("Authorization", "Basic "+ btoa(username+":"+password));
        },
        success: function(data){
          $('#codepressHock').html(data.data.code);
        },
        error: function(error){
          alert(error);
        }
      });
    }
  });
});

我在服务器端设置了所有相关的CORS标头。这是网络流量:

Request URL:https://dev.radbonus.com/admin/affiliate-connections/retrieveSingle/45.json
Request Method:OPTIONS
Status Code:401 Unauthorized
Remote Address:185.102.94.230:443
Referrer Policy:no-referrer-when-downgrade

Response Headers
view source
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type, X-Requested-With, Authorization, Origin
Access-Control-Allow-Methods:POST, GET, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin:http://radbonus.com
Access-Control-Max-Age:31536000
Content-Length:463
Content-Type:text/html; charset=iso-8859-1
Date:Sat, 24 Jun 2017 11:25:33 GMT
Server:Apache/2.4.18 (Ubuntu)
WWW-Authenticate:Basic realm="Admin"

Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:authorization,content-type
Access-Control-Request-Method:GET
Connection:keep-alive
Host:dev.radbonus.com
Origin:http://radbonus.com
Referer:http://radbonus.com/plugintest/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

我知道这个主题有很多帖子,但似乎我错过了一些简单的东西。有谁可以帮助我?

4 个答案:

答案 0 :(得分:8)

更新看起来我不对。永远不会为Authorization请求发送OPTIONS标头。请参阅comment by sideshowbarker - 您需要确保您的服务器未响应401OPTIONS请求。

我不知道您的服务器是用什么语言编写的,但是您以错误的方式实现了授权 - 应该从auth中排除OPTIONS方法。另见 - OPTIONS request authentication

以下是过时的答案:

您的服务器端要求此请求的HTTP基本身份验证。而且您不提供凭据。 401错误与CORS无关;它只是意味着服务器选择不授权您的请求,因为您没有提供身份验证凭据。

如果您尝试直接在浏览器中打开此网址(如https://dev.radbonus.com/admin/affiliate-connections/retrieveSingle/1.json),系统会要求您输入login& password,这是浏览器使用WWW-Authenticate标头处理401错误的方式。

请注意,Authorization标题实际上不包含在您的请求中。 因此,您可能只需在调用中直接包含标题,而不是使用beforeSend挂钩:

headers: {
    'Authorization': 'Basic ' + btoa(username+':'+password),
},

并确保在您的请求中显示Authorization标题。

答案 1 :(得分:1)

浏览器使用方法 - OPTIONS 发出飞行前请求,在实际 GET/POST/PUT 方法之前,使用您将为实际请求发送的标头名称(仅)。 这就是为什么您的飞行前请求标头看起来像这样,

**Access-Control-Request-Headers:authorization,content-type**

现在,在您的服务器中,您应该为 OPTIONS 请求返回 HTTP_STATUS.OK - 200。如果它返回任何其他状态,那么您的实际请求将不会发送到服务器。

这是一篇关于 CORS 的好书。 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

我最近遇到了同样的问题,并通过返回 200 来修复我的 Servlet 过滤器 (SpringBoot) 中的 OPTIONS 方法。

答案 2 :(得分:0)

  

请在标题中添加跨域名:

$.ajax({
        url: "https://dev.radbonus.com/admin/affiliate-connections/retrieveSingle/"+challengeid+".json",
        method: "GET",
        dataType: "json",
        jsonp: false,
        contentType: "application/json",
        xhrFields: {
          withCredentials: true
        },
        crossDomain: true,
        beforeSend: function(xhr){
          xhr.setRequestHeader("Authorization", "Basic "+ btoa(username+":"+password));
 xhr.setRequestHeader("Access-Control-Allow-Origin",'*');
        },
        success: function(data){
          $('#codepressHock').html(data.data.code);
        },
        error: function(error){
          alert(error);
        }
      });

答案 3 :(得分:0)

您应检查是否已禁用“匿名身份验证”,以允许任何身份验证,例如“ Windows身份验证”。 如果您将其禁用,则对于任何预检请求都将获得401,因为他们没有在其请求中发送凭据。

您应该启用“匿名身份验证”并在IIS中使用“授权规则”部分,以避免匿名访问。 如果没有它,可以将其安装在以下部分的Windows功能中:

Internet信息服务(IIS)-万维网 服务-安全-URL授权

例如,您可以这样设置授权规则: enter image description here enter image description here

You can read more about it here