2015-02-18 12 views
8

Udało mi się pomyślnie wywołać adres URL znajdujący się za katalogiem w Apache, który jest chroniony za pomocą podstawowego uwierzytelniania (htpasswd itp.). Żądanie Ajax GET działa normalnie i zwraca zawartość Zabezpieczony:Przekierowanie JavaScript z nagłówkiem autoryzacji

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'; 
    } 
}); 

Mój oryginalny założeniem było to, że po sesji internetowej udało się uprawniony do żądania, by to umożliwić przekierowanie w „sukces” bloku bez pytania użytkownika referencje. Po wywołaniu tego bloku kodu użytkownik wprowadził nazwę użytkownika i hasło w niezabezpieczonym środowisku. Jednak po wywołaniu przekierowania przeglądarka otworzy okno logowania/hasła.

Jakieś sugestie, w jaki sposób mogę wstępnie autoryzować sesję z podstawową autoryzacją, która zostałaby dostarczona przez użytkowników?

+0

czy to działa, jeśli uwierzytelnienie ustawienie 'headers' AJAX zamiast' beforeSend'? Na przykład: 'headers: {" Authorization ":" Basic "+ kodowany}' – Stef

+0

Minęło trochę czasu, myślę, że testowałem to z tymi samymi wynikami. – hcabral

+2

Wygląda na to, że [Nagłówek autoryzacji działa] (http://stackoverflow.com/questions/20617720/why-doesnt-the-browser-reuse-the-authorization-headers-after-an-authenticated-x) w przypadku AJAX. Pliki cookie są automatycznie wysyłane z prośbami, a Ty możesz to odczytać na serwerze, aby sprawdzić autoryzację (musisz pamiętać o XSS, CSRF). Każdy konkretny powód, dla którego chcesz korzystać z podstawowego uwierzytelniania? –

Odpowiedz

1

Logowanie za pomocą żądania AJAX zwykle działa, ponieważ pomyślne żądanie AJAX ustawia pliki cookie sesji, które będą przesyłane we wszystkich kolejnych żądaniach w sposób przezroczysty.

Może twoje pliki cookie są ustawione, ale z jakiegoś powodu nie są ustawione w sposób przezroczysty: możesz sprawdzić za pomocą xhr.getAllResponseHeaders()/xhr.getResponseHeader(), a następnie ustawić je za pomocą document.cookie.

Jeśli nie ma plików cookie sesji, takie zachowanie zwykle kończy się niepowodzeniem.

Można próbować przekierować z nazwą użytkownika + hasło w URL (nie zalecane, ponieważ nazwa użytkownika + hasło prawdopodobnie będą widoczne w przeglądarce adresu url barze później):

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

Również należy przetestować, aby opóźnić przekierowanie ... bo może to działa, ale trzeba dać trochę czasu do przeglądarki, czy spróbować:

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); 
     } 
    });