使用jQuery进行跨域基本身份验证

时间:2010-08-03 03:58:19

标签: jquery grails jsonp basic-authentication

这是我的问题:我正在开发一个可以轮询以检索动态数据的系统。它在Grails中,当我对某个控制器操作发出请求时,请说“http://localhost:8080/foo/bar”,返回包含最新数据的JSON列表。

为了增加安全性和功能,我使用Spring Security(Grails Acegi插件)保护我的页面,并启用了基本身份验证。登录时,系统会自动加载有关您的用户配置文件的信息,并更改返回的数据。因此,身份验证是强制性的。

这样做:我可以从任何浏览器轮询我的操作,并返回数据。我的Grails应用程序中有一个JavaScript脚本,用于调用此URL。

问题在于我想将我的JavaScript脚本外部化以将其分发给客户,这样他们就可以构建自己的HTML文件,插入我的JavaScript文件,并能够访问我的数据(有点像API)使用AJAX。像这样:

$.ajax(url: urlWithParams, 
       method: 'GET', 
       beforeLoad: function(xhr) { 
           xhr.setRequestHeader('Authorization', authString);
       },
       success: myFunction
});

然而,它不起作用。首先,我知道跨域GET请求很棘手。但在我的情况下,我使用基本身份验证,这是更棘手的,因为我需要直接将凭据放入XmlHttpRequest,并在Firefox中生成预检请求(替换OPTIONS的OPTIONS),我的Grails应用程序不处理它

我的问题很具体。我使用基本身份验证来防止恶意访问,但由于某些跨域限制,我无法使用正确的凭据访问我的应用程序!

我该怎么办!我尝试使用IFrame,但是我无法获取页面内容(我收到了“拒绝访问”错误 - 再次出现跨域限制)。

此外,ajax()函数中的jQuery用户名和密码字段不起作用。

我可以在不受保护的页面上执行简单的AJAX GET请求,将凭据作为参数发送,然后页面将使用凭据重定向到受保护的页面吗?浏览器不会破坏请求,但是我可以使用基本身份验证凭据进行重定向吗?

我觉得它不起作用(与重定向有关,它会产生新的请求等等)。我是对的,还是应该有用?

JSONP可以解决这个问题吗?我不知道如何使用JSONP集成基本身份验证,但是......

非常感谢!

1 个答案:

答案 0 :(得分:1)

我使用JSONP解决了我的问题。我修改了我的应用程序,因此不需要对AJAX调用进行基本的身份验证。来自jQuery的$ .getJSON()方法起到了作用。