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

Dyl*_*lan 28 javascript ajax jquery http-authentication basic-authentication

我有一个基于REST的服务器,我试图使用JQuery进行通信.XML和JSON都可用作响应格式,因此我使用的是JSON.

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

现在我试图将一些东西与JQuery放在一起,并使用HTTP基本身份验证遇到无穷无尽的问题.

我已经仔细研究了之前的许多问题,其中大部分都有解决方案似乎没有实际工作或将整个问题归咎于跨域访问,我已经在基本的Javascript测试中克服了这些问题.响应始终为Access-Control-Allow-Origin请求中提供的Origin头提供set,这可以在我的测试的响应中看到.

在基本的javascript中,这个完整的调用非常简单:

req.open('GET', 'https://researchdev-vm:8111/card', true, 'test', 'testpassword');
Run Code Online (Sandbox Code Playgroud)

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');
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

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

有没有更好的方法来完成应该是一个非常微不足道的电话?OPTIONS请求不使用beforeSend()函数处理的事实应该被视为错误吗?有没有办法完全禁用OPTIONS检查?不可能使这个调用不是跨站点,因为Javascript似乎甚至考虑与"跨站点"在同一台机器上的不同端口号.

wes*_*ell 1

这是充当 AJAX 调用的直通身份验证的东西。这依赖于NTLM在将执行 javascript 的页面上进行身份验证。也许这会对您有所帮助:

PHP代码:

<?php 
$headers = apache_request_headers();
if (isset($headers['Authorization'])) 
   echo "<script>var auth = " . $headers['Authorization'] . "</script>";
unset($headers);
?>
Run Code Online (Sandbox Code Playgroud)

使用 jQuery,你可以这样使用它:

$.ajax({
        type: 'POST',
        url: './somePage.php',
        data: {"test":true},
        dataType: 'json',
        success: function(data) {
            console.log(data.username);
        },
        beforeSend : function(req) {
            req.setRequestHeader('Authorization', auth); // <<<<----- USED HERE
        },
});
Run Code Online (Sandbox Code Playgroud)

对于标准 XMLHttpRequest:

var xml = new XMLHttpRequest();
xml.open('GET', './somePage.php', true);
xml.setRequestHeader('Authorization', auth); // <<<<----- USED HERE
xml.send();
Run Code Online (Sandbox Code Playgroud)