jquery跨域身份验证

时间:2012-05-26 21:08:49

标签: jquery http authentication cross-domain jetty

我将Jetty服务器配置为允许跨域http请求(allowedOrigins = *),并使用其CrossOriginFilter允许跨域身份验证(allowCredentials = true)。 没有身份验证要求的跨域http请求正常工作。现在谈到需要身份验证的http调用它并没有使用JQuery。我使用以下代码并遵循此示例:http://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/

function login(username, password) {
$.ajax({
    type: "GET",
    contentType: "application/json",
    dataType: "json",
    url: url,
    beforeSend: function(xhr) {
        var base64 = Base64.encode(username + ":" + password);
        xhr.setRequestHeader("Authorization", "Basic " + base64);
        xhr.withCredentials = true;
    },
    error: function(data){
        alert("error");
    },
    success: function(data){
        alert("success"); 
    }
});

在HTTPFox中,我看到以下对服务器的请求:

OPTIONS /login HTTP/1.1
...
Access-Control-Request-Method   GET
Access-Control-Request-Headers  authorization,content-type

服务器以

响应
HTTP/1.1 204 No Content
...
Allow   OPTIONS,GET,HEAD

我也使用了下面的选项,但没有什么区别。

$.ajax({
    ...
    username: username,
    password: password,
    ...
}

错误功能始终触发。 有谁知道问题可能是什么?

3 个答案:

答案 0 :(得分:5)

由于默认允许的标头是

  

X-请求-随着,内容类型,接受,起源

我必须添加标题

  

授权,内容类型

通过日志文件找到这个

  

DEBUG [2012-05-27 17:04:02,468] org.eclipse.jetty.servlets.CrossOriginFilter:标题[authorization,content-type]不在允许的标题中[X-Requested-With,Content-Type,接受,原产地]

感谢所有提示!

答案 1 :(得分:3)

您在应用程序中设置的响应标头 - 未启用安全性时00正常工作,正如您所证明的那样。但是,启用安全性后,您的跨域请求将失败。

这可能是由于安全过滤器设置的额外过滤器和其他响应标头,以便生成响应。

要解决此问题,高级解决方案是您必须在安全过滤器设置其响应标头和/或将其提交给客户端之前设置您的响应标头。

你也在使用Jetty;因此,您可以使用Jetty Cross Origin Filter确保响应标头在过滤器链中按照需要设置的顺序进行设置:

以下是可以传递到web.xml中的过滤器配置的参数列表:

  
      
  • allowedOrigins,允许访问资源的逗号分隔的源列表。默认值为*,表示所有来源

  •   
  • allowedMethods,一个逗号分隔的HTTP方法列表,允许在访问资源时使用。默认值为GET,POST

  •   
  • allowedHeaders,一个逗号分隔的HTTP标头列表,允许在访问资源时指定。默认值为X-Requested-With

  •   
  • preflightMaxAge,客户端可以缓存预检请求的秒数。默认值为1800秒,或30分钟

  •   
  • allowCredentials,一个布尔值,指示资源是否允许具有凭据的请求。默认值为false

  •   

默认情况下,Allowed Origins响应标头设置为*,这意味着默认情况下,可以从任何域发出任何请求。假设您不希望所有域的每个请求都有效,您需要确保修改此选项以仅允许您打算列入白名单的域:

过滤器的web.xml条目:

<web-app ...>
    ...
    <filter>
        <filter-name>cross-origin</filter-name>
        <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cross-origin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>

以下是您可能会发现有助于解决此特定问题的其他资源的列表:

答案 2 :(得分:0)

对于SOAP内容,允许的头文件还应包含messagetype,soapaction

请注意,不允许使用通配符来配置允许的标头...