【发布时间】:2012-03-30 07:52:30
【问题描述】:
我有一个基于 REST 的服务器,我正在尝试使用 JQuery 与之通信。 XML 和 JSON 都可以作为响应格式,所以我使用的是 JSON。
连接都是 SSL,所以 HTTP 基本身份验证一直是我们选择的授权方法,并且我们在其他前端(原始 Javascript、Silverlight 等)方面没有问题
现在我正在尝试将一些东西与 JQuery 放在一起,但在使用 HTTP 基本身份验证时遇到了无穷无尽的问题。
我已经浏览了许多以前的问题,其中大多数问题的解决方案似乎并没有真正起作用,或者将整个问题归咎于跨源访问,我已经在基本的 Javascript 测试中克服了这些问题。响应始终提供 Access-Control-Allow-Origin 设置为请求中提供的 Origin 标头,这可以在我的测试响应中看到。
在基本的 javascript 中,整个调用非常简单地通过以下方式完成:
req.open('GET', 'https://researchdev-vm:8111/card', true, 'test', 'testpassword');
JQuery 在这方面的尝试是相当标准的:
$.ajax({
username: 'test',
password: 'testpassword',
url: 'https://researchdev-vm:8111/card',
type: 'GET',
dataType: 'json',
crossDomain: true,
/*data: { username: 'test', password: 'testpassword' },*/
beforeSend: function(xhr){
xhr.setRequestHeader("Authorization",
//"Basic " + encodeBase64(username + ":" + password));
"Basic AAAAAAAAAAAAAAAAAAA=");
},
sucess: function(result) {
out('done');
}
});
实际上似乎可以提供身份验证的唯一方法是将 Base64 编码数据直接插入 beforeSend() 函数中。如果这不包括在内,则没有任何进展。用户名和密码属性似乎完全被忽略了。
通过提供beforeSend() 行为,GET 调用会获得包含数据的肯定响应。但是,因为这是一个跨站点调用,OPTIONS 调用在 GET 调用之前执行并且总是失败,因为它没有使用beforeSend(),因此由于身份验证失败而得到 401 响应。
有没有更好的方法来完成一个非常微不足道的调用? OPTIONS 请求不使用beforeSend() 函数处理这一事实是否应该被视为错误?有没有办法完全禁用 OPTIONS 检查?不可能使这个调用不是跨站点的,因为 Javascript 似乎甚至将同一台机器上的不同端口号视为“跨站点”。
【问题讨论】:
-
您不必拥有发送前和用户名/密码字段。我会从您的 $.ajax 函数中删除用户名/密码字段。
标签: javascript jquery ajax basic-authentication http-authentication