带有Authorization标头的JavaScript重定向URL

JavaScript redirect URL with Authorization header

本文关键字:JavaScript 重定向 URL Authorization 带有      更新时间:2024-01-01

我成功地调用了Apache中受基本身份验证(htpasswd等)保护的目录后面的URL。Ajax GET请求工作正常,并返回受保护的内容:

var encoded = Base64.encode(username + ':' + password);
$.ajax({
    url: "/app/test",
    type: "GET",
    beforeSend: function(xhr) {
        xhr.setRequestHeader('Authorization', 'Basic ' + encoded);
    },
    success: function() {
        window.location.href = '/app/test.html';
    }
});

我最初的假设是,一旦web会话成功授权了请求,就可以在"成功"块中进行重定向,而无需询问用户凭据。当调用此代码块时,用户已经在非保护环境中输入了用户名和密码。但是,当调用重定向时,浏览器将弹出登录/密码窗口。

关于如何使用用户提供的基本授权预授权会话,有什么建议吗?

使用AJAX请求进行日志记录通常有效,因为成功的AJAX请求会设置会话cookie,这些cookie将在所有后续请求中透明发送。

也许你的cookie已经设置好了,但由于某些原因没有透明设置:你可以使用xhr.getAllResponseHeaders()/xhr.getResponseHeader()进行检查,然后使用document.cookie.进行设置

如果没有会话cookie,则此行为通常会失败。

您可以尝试在url中使用用户名+密码重定向(不建议使用,因为用户名+密码可能会在之后的浏览器地址url栏中显示):

    window.location.href =
        window.location.protocol + "//" +
        username + ":" + password + "@" +
        window.location.hostname +
        (window.location.port ? ":" + window.location.port : "") +
        '/app/test.html';

此外,您应该测试以延迟重定向。。。因为也许它可以工作,但你需要给浏览器一些额外的时间,你试过了吗:

   var encoded = Base64.encode(username + ':' + password);
   $.ajax({
       url: "/app/test",
       type: "GET",
       beforeSend: function(xhr) {
           xhr.setRequestHeader('Authorization', 'Basic ' + encoded);
       },
       success: function() {
           setTimeout(function() {
               window.location.href = '/app/test.html';
           }, 333);
       }
   });