URL-адрес перенаправления JavaScript с заголовком авторизации

Мне удалось успешно вызвать URL-адрес за каталогом в Apache, который защищен базовой аутентификацией (htpasswd и т.д.). Запрос 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';
    }
});

Мое первоначальное предположение заключалось в том, что, как только веб-сессия успешно разрешила запрос, это сделало бы возможным перенаправление в блоке "success" без запроса учетных данных пользователя. Когда этот кодовый блок вызывается, пользователь ввел имя пользователя и пароль в незащищенной среде. Однако при вызове перенаправления браузер отобразит окно входа/пароля.

Любые предложения о том, как я могу предварительно авторизовать сеанс с базовой авторизацией, который был бы предоставлен пользователями?

Ответ 1

Регистрация с помощью запроса AJAX обычно работает, потому что успешный запрос AJAX устанавливает куки сеанса, которые будут отправляться во всех последующих запросах прозрачно.

Возможно, ваши файлы 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);
       }
   });