使用jquery和BASIC身份验证的Ajax跨域请求?

时间:2013-04-12 10:17:59

标签: javascript ajax glassfish cross-domain basic-authentication

如果有人能告诉我该身份验证有什么问题,我真的很感激吗?我从服务器上取下身份验证,在没有它的情况下进行测试,但javascript被破坏了。

 $('#btnSignIn').click(function() {
            var username = $("#username").val();
            var password = $("#password").val();

    function make_base_auth(user, password) {
            var tok = user + ':' + password;

            var final = "Basic " + $.base64.encode(tok);
            console.log("FINAL---->" +final);
            alert("FINAL---->" +final);

            return final;
}

            $.ajax({
                        type: "GET",
                        contentType: "application/json",
                        url: "http://localhost:8080/SesameService/webresources/users/secured/login",
                        crossDomain: true,
                        dataType: "text",
                        async: false,
                        data: {},
                        beforeSend: function (xhr){ 
                            xhr.setRequestHeader('authorization', make_base_auth(username, password));
                       },
                        success: function() {
                            alert('Thanks for your signin in! ');

                        },
                        error: function(jqXHR, textStatus, errorThrown) {
                            console.log(textStatus, errorThrown);
                            alert(' Error in signIn-process!! ' +textStatus);
                        }
                    });
        });

错误:如果我拿

beforeSend: function (xhr){ 
    xhr.setRequestHeader('authorization', make_base_auth(username, password));

- 离开该功能,我可以进入REST服务。我目前还没有进行身份验证。这可能是我在使用该标头时在服务器上进行身份验证的原因吗?

contentType: "application/json",

@GET
@Path("/secured/login")
@Produces({"text/plain"})
public String login() {

    return "Is it working or not?";
}

在JS中使用beforeSend-part时,出现错误:

[Exception... "Failure" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: http://localhost:8383/Sesame/assets/js/jquery.min.js :: .send :: line 3" data: no] { message="Failure"
, result=2147500037
, name="NS_ERROR_FAILURE"
, 

如果我理解正确,标题中的“authorization + Basic”告诉Glassfish服务器,将完成基本身份验证。身份验证后,它转到REST服务,在我的情况下,返回json-object到HTML5客户端。 HTML5-client在localhost:8383中运行,其余服务在localhost:8080中运行。

如果我直接在localhost:8080中运行安全的rest-services,它就可以了,所以这不是问题。问题是,当我使用或尝试使用来自不同域localhost:8383的rest-services时,我得到JS-error console.log('---- ERROR IN ------ Siging IN-- --------');我不是百分百肯定,但我认为问题是401未经授权,因此跨域身份验证无效。

Shoud我插入crossDomain:true?我在某个地方看过它,也许情况可能就是这样?

在服务器端,我有过滤器:

<init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>util.CrossOriginResourceSharingFilter</param-value>
    </init-param>

public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
    response.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
    response.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
    response.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "content-type");
    return response;
}

问题

1)如果服务器没有配置用于身份验证,我仍然可以使用授权标头来破坏应用程序并导致错误吗?

2)JS错误意味着什么?

干杯, 萨米

0 个答案:

没有答案