我知道这个问题已经讨论了很多。我经历了其他所有SO的问题,但仍然没有解决方案。
我的测试用例很简单。
其实我尝试了很多东西(使用标题( Access-Control-Allow-Credentials , Access-Control-Allow-Origin ),尝试使用 beforeSend 功能,处理jsonP等)。没有运气。
<html>
<head>
<script src="./jquery-1.11.0.js"></script>
</head>
<body>
<div id="target">
Click here
</div>
<script>
$("#target").click(function() {
var username = 'user';
var password = 'passwd';
$.ajax({
type: "GET",
beforeSend: function (xhr) {
xhr.withCredentials = true;
xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password));
},
// I know, this one is redundant
xhrFields: { withCredentials: true },
crossDomain: true,
headers: { 'Access-Control-Allow-Credentials': true },
headers: { 'Access-Control-Allow-Origin': '*' },
// this one is redundant too
headers: { 'Authorization': "Basic " + btoa(username + ":" + password) },
//contentType: "application/json; charset=utf-8",
dataType: 'jsonp',
url: "http://httpbin.org/basic-auth/user/passwd",
success: function(data, textStatus, jqXHR){
alert('success');
},
error: function(jqXHR, textStatus, errorThrown ) {
alert('failure');
},
// I don't know if I have to write it directly or not
username: 'user',
password: 'passwd'
});
});
</script>
</body>
</html>
在我的所有测试中,我得到了不同的结果。上面的代码导致httpbin显示auth弹出窗口以输入凭据(这很奇怪,因为我在标头中发送用户/传递对)。我得到的另一个结果是:UNAUTHORIZED状态(这是可以理解的),“错误”错误信息(这是无意义的)等等......
jQuery和跨域请求的专家,请帮助弄清楚应该在这里做什么。
P.S。我知道这与CORS问题密切相关,但我尝试以不同的方式设置 Access-Control-Allow-Origin ,但没有成功。
更新
实际上我的最初目标是能够从JS代码调用CI作业(使用基本HTTP AU身份验证通过REST API调用TeamCity作业)。
所以,对于TeamCity,我相信有一个错误(在REST API插件中) - 任何有兴趣的人,请跟踪问题TeamCity's REST API Plugin doesn't allow to authenticate using Basic HTTP Authentication
关于httpbin.org - 测试完全无效。
非常感谢!