【问题标题】:jquery cross domain authenticationjquery跨域认证
【发布时间】:2012-06-01 22:39:02
【问题描述】:

我将我的 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,
    ...
}

错误函数总是触发。 有人知道问题可能是什么吗?

【问题讨论】:

  • 您在响应标头Access-Control-Allow-Origin:* 中看到了吗?顺便说一句,好问题!欢迎使用 StackOverflow!
  • 我认为,如果您也可以显示与该问题相关的任何堆栈跟踪,那将会很有帮助。
  • 好的,请检查该标题是否包含在您的回复中。如果不是,那么安全性可能会覆盖响应标头。需要查看更多日志以进一步调试。祝你好运! :)
  • @jmort253:不,我在服务器的响应中没有看到这个标头。码头的安全?我可以提供什么样的日志或堆栈跟踪?
  • 这将在框架或服务器级别。服务器通常以比您的应用程序低得多的级别记录事物,因此您需要修改 logging.properties(或您使用的任何记录器)并将其设置为在 DEBUG 或 ALL 上记录,以便您可以查看服务器和框架的内容正在做幕后工作。您正在寻找在没有 Access-origin 标头的情况下设置的标头的任何实例

标签: jquery http authentication cross-domain jetty


【解决方案1】:

默认允许的标题是

X-Requested-With,Content-Type,Accept,Origin

我必须添加标题

授权,内容类型

通过日志文件找到这个

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

感谢所有提示!

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

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

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

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

    默认情况下,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>
    

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

    【讨论】:

      【解决方案3】:

      对于 SOAP 内容,允许的标头还应包括 messagetype、soapaction

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

      【讨论】:

        猜你喜欢
        • 2012-04-21
        • 2010-11-06
        • 2017-01-14
        • 2021-11-24
        • 2021-12-01
        • 2016-02-08
        相关资源
        最近更新 更多