2013-01-15 139 views
2

我遇到了这个代码的麻烦,我似乎无法让它工作。我为此调用返回的典型错误是“无法加载资源:服务器响应的状态为401(未授权)”。跨域jQuery ajax调用不起作用

$('#btnZendesk').click(function() { 
     $.ajax({ 
      url: "https://flatlandsoftware.zendesk.com/api/v2/topics/22505987.json", 
      type: 'GET', 
      crossDomain: true, 
      xhrFields: { 
       withCredentials: true 
      }, 
      cache: false, 
      dataType: 'jsonp', 
      processData: false, 
      data: 'get=login', 
      timeout: 2000, 

      username: "[email protected]", 
      password: "test", 
      success: function (data, textStatus, response) { 
       alert("success"); 
      }, 
      error: function (data, textStatus, response) { 
       alert(data); 
      } 
     }); 
+0

同源策略不会允许你做跨域AJAX请求。 – gronostaj

+0

https://flatlandsoftware.zendesk.com/api/v2/topics/22505987.json资源受基本认证保护 – Tom

+2

错误的密码和用户名? – JJJ

回答

6

问题是您尝试访问的资源受基本验证保护。

您可以使用beforeSend jQuery的回调添加一个HTTP标头的身份验证信息,例如:

beforeSend: function (xhr) { 
    xhr.setRequestHeader ("Authorization", "Basic XXXXXX"); 
} 

另外,您可以使用jQuery ajaxSetup

$.ajaxSetup({ 
    headers: { 'Authorization': "Basic XXXXX" } 
}); 

编辑

几个提到功能的链接

编辑2

授权头构造如下:

  • 用户名和密码被连接成一个字符串"username:password"并将结果字符串使用编码的Base64

例子:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 
+0

他是对的;因此,他必须给予积分。 – FinalForm

+0

感谢您的回复。我不确定要在哪里添加前期功能以及在哪里输入我的密码。它会是xhr.setRequestHeader(“授权”,“基本myusername:mypassword”)? –

+0

@Michael,我刚刚添加了如何生成基本身份验证的信息。你很近。但是不要在空格处添加空格:在最后一个字符串之后使用Base64。 – Tom

0

我也有这个问题,并从互联网上莫名其妙的所有解决方案的失败或不适用,由于客户端的web服务的限制(JSONP,XDR,CORS = TRUE)

为此,我在我的页面中添加了一个驻留在客户端服务器中的iframe。所以,当我们将数据发布到iframe和iframe然后将其发布到web服务。因此消除了跨域引用。

我们添加了一个双向来源检查,以确认只有经过授权的页面发布数据往返于iframe。

希望它可以帮助

<iframe style="display:none;" id='receiver' name="receiver" src="https://iframe-address-at-client-server"> 
</iframe> 

//send data to iframe 
var hiddenFrame = document.getElementById('receiver').contentWindow; 
hiddenFrame.postMessage(JSON.stringify(message), 'https://client-server-url'); 

//The iframe receives the data using the code: 
window.onload = function() { 
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; 
    var eventer = window[eventMethod]; 
    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; 
    eventer(messageEvent, function (e) { 
     var origin = e.origin; 
     //if origin not in pre-defined list, break and return 
     var messageFromParent = JSON.parse(e.data); 
     var json = messageFromParent.data; 

     //send json to web service using AJAX 
     //return the response back to source 
     e.source.postMessage(JSON.stringify(aJAXResponse), e.origin); 
    }, false); 
}