javascript - 使用 HTTP 基本身份验证的 JQuery Ajax 调用

标签 javascript jquery ajax basic-authentication http-authentication

我有一个基于 REST 的服务器,我正在尝试使用 JQuery 与其进行通信。 XML 和 JSON 都可用作响应格式,因此我使用 JSON。

连接都是 SSL,因此 HTTP 基本身份验证一直是我们选择的授权方法,并且我们与其他前端(原始 Javascript、Silverlight 等)没有任何问题

现在我尝试将一些东西与 JQuery 结合在一起,但使用 HTTP 基本身份验证时遇到了无穷无尽的问题。

我已经仔细研究了之前的许多问题,其中大多数问题要么提供了似乎实际上不起作用的解决方案,要么将整个问题归咎于跨源访问,而我已经在基本的 Javascript 测试中克服了这一点。响应始终将 Access-Control-Allow-Origin 设置为请求中提供的 Origin header ,这可以在我的测试响应中看到。

在基本的 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');
        }
    });

实际上似乎可以提供身份验证的唯一方法是在 beforeSend() 函数中直接插入 Base64 编码数据。如果不包括这一点,就没有取得任何进展。用户名和密码属性似乎被完全忽略。

通过提供 beforeSend() 行为,GET 调用将获得包含数据的肯定响应。但是,由于这是跨站点调用,因此在 GET 调用之前执行 OPTIONS 调用并且始终会失败,因为它没有使用 beforeSend() ,因此会因失败而收到 401 响应身份验证。

是否有更好的方法来完成一个非常简单的调用? OPTIONS 请求没有使用 beforeSend() 函数处理这一事实是否应该被视为错误?有没有办法完全禁用 OPTIONS 检查?不可能使此调用不跨站点,因为 Javascript 似乎将同一台计算机上的不同端口号视为“跨站点”。

最佳答案

这个问题可能已经过期了,但我正在使用 Jquery 处理同样的事情,并遇到了同样的问题。

用户名和密码属性似乎没有像通常完成 HTTP 基本身份验证那样对用户名/密码进行 Base64 编码。

查看以下请求(为简洁起见,已缩短),首先使用 JQuery AJAX 方法中的“用户名”和“密码”参数:

Request URL:http://testuser%40omnisoft.com:testuser@localhost:60023/Account
Request Method:GET
Accept:application/json, text/javascript, */*; q=0.01
Host:localhost:60023

现在使用 beforeSend 方法:

Request URL:http://localhost:60023/Account
Request Method:GET
Accept:application/json, text/javascript, */*; q=0.01
Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Host:localhost:60023

请注意,第一个方法在请求中不包含“Authorization” header ,而是在目标 URL 前添加前缀。我不是 HTTP 基本身份验证方面的专家,但这表明前者不是正确的实现,因此会失败(或者至少对于我自己的服务器实现来说是这样)。

至于使用 JSONP 的 OPTIONS 请求 - 为了明确起见,您可以尝试在 URL 中使用 ?callback=? 而不是使用 crossdomain 选项。

关于javascript - 使用 HTTP 基本身份验证的 JQuery Ajax 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692067/

相关文章:

jquery - 多个定位对齐的类被拉到一个 div 而不是它们各自的 div

javascript - 如何检查 json 数组中是否存在某个值?如果找到匹配,则删除该键值对

jQuery 屏蔽输入插件与验证插件冲突

javascript - 如何通过ajax将多个变量传递给codeigniter Controller ?一个变量是通过序列化

jquery - 通过 ajax 访问 Wunderlist API http 来列出任务

javascript - 如何使完整的百万值显示在 y 轴和工具提示上 (Highcharts)

javascript - Auth0 未重定向到指定的 URL (React)

javascript - 使用 COM + IE 自动化进行 JavaScript 回发后保存文本文件

JavaScript 按钮

javascript - 将数据加载到 Web 应用程序中