2015-02-18 8 views
8

Ich konnte erfolgreich eine URL hinter einem Verzeichnis in Apache, das mit Basic Authentication (htpasswd, etc.) geschützt ist, aufrufen. Die Ajax-GET-Anfrage funktioniert normal und gibt den geschützten Inhalt:JavaScript-Weiterleitungs-URL mit Autorisierungsheader

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

Meine ursprüngliche Annahme war, dass, wenn die Web-Sitzung erfolgreich eine Anforderung autorisiert hätte, wäre es möglich, die Umleitung in dem ‚Erfolg‘ Block zu machen, ohne Benutzer zu fragen Anmeldeinformationen. Wenn dieser Codeblock aufgerufen wird, hat der Benutzer Benutzername und Kennwort in einer nicht geschützten Umgebung eingegeben. Wenn die Umleitung jedoch aufgerufen wird, öffnet der Browser das Anmelde-/Passwortfenster.

Alle Vorschläge, wie ich eine Sitzung mit der Basic Authorization vorautorisieren könnte, die von den Benutzern bereitgestellt wurde?

+0

funktioniert es, wenn Sie mit AJAX authentifizieren 'headers' statt' beforeSend' Einstellung? Zum Beispiel: 'headers: {" Authorization ":" Basic "+ encoded}' – Stef

+0

Es ist schon eine Weile her, ich glaube ich habe es mit den gleichen Ergebnissen getestet. – hcabral

+2

Es scheint so ist, wie [Authorization Header funktioniert] (http://stackoverflow.com/questions/20617720/why-doesnt-the-browser-reuse-the-authorization-headers-after-an-authenticated-x) für den Fall von AJAX. Cookies werden automatisch mit Anfragen gesendet, und Sie können diese auf dem Server lesen, um die Autorisierung zu überprüfen (müssen XSS, CSRF berücksichtigen). Gibt es einen bestimmten Grund, warum Sie die Standardauthentifizierung verwenden möchten? –

Antwort

1

Die Protokollierung mit AJAX-Anforderung funktioniert normalerweise, weil eine erfolgreiche AJAX-Anforderung Sitzungscookies festlegt, die in allen nachfolgenden Anforderungen transparent gesendet werden.

Vielleicht sind Ihre Cookies gesetzt, aber aus irgendeinem Grund nicht transparent gesetzt: Sie können mit xhr.getAllResponseHeaders()/xhr.getResponseHeader() überprüfen und danach mit document.cookie setzen.

Wenn keine Sitzungscookies vorhanden sind, schlägt dieses Verhalten normalerweise fehl.

Sie können versuchen, mit dem Benutzername + Passwort in der URL (nicht empfohlen, da Benutzername + Passwort wahrscheinlich Adresse URL-Leiste im Browser sichtbar danach sein wird) zu umleiten:

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

Auch sollten Sie testen, zu verzögern die Umleitung ... weil vielleicht es funktioniert, aber Sie brauchen etwas mehr Zeit, um den Browser zu geben, haben Sie versucht:

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