2012-07-18 14 views
6

Próbuję autoryzować zapytanie AJAX oparte na this tutorial. Ustawia nagłówki żądań przed wysłaniem z odpowiednimi informacjami autoryzacyjnymi za pomocą biblioteki Crypto. Problem, który mam, polega na tym, że nagłówki nie są ustawione na żądanie. Oto mój kod:Autoryzacja nagłówka jQuery AJAX

beforeSend : function(xhr) { 
    var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
    var base64 = Crypto.util.bytesToBase64(bytes); 
    xhr.setRequestHeader("Authorization", "Basic " + base64); 
}, 
+0

Co sprawia, że ​​nagłówek nie jest ustawiony? Czy sprawdziłeś rzeczywiste połączenie xhr? Czy 'Crypto',' username' lub 'password' może mieć wartość' undefined'? Możesz także użyć zwijania i ustawić nagłówek (-H) i sprawdzić, czy nie jest to problem po stronie serwera. BTW, jestem tym, który napisał ten post na blogu ;-) – pdeschen

+0

Piszę wywołanie xhr do dziennika, czego szukam w obiekcie? Sprawdziłem i wszystkie 3 są zdefiniowane poprawnie. Co się obecnie dzieje, otrzymuję 401 nieautoryzowany błąd z oczywistych powodów. Dobrze wiedzieć, dobry post. –

+0

w Chrome, jeśli otworzysz Narzędzia dla programistów i wybierzesz kartę Sieć, a następnie element XHR na dolnej liście, możesz sprawdzić rzeczywiste żądania ajax, jego zawartość, nagłówki i wszystkie. – pdeschen

Odpowiedz

8

Problem nie został ustawienie dataType do JSONP. Ponieważ tak się nie stało, przeglądarka interpretowała wywołanie jako standardowe żądanie AJAX, co oznaczało, że był blokowany w ramach zasad dotyczących tego samego pochodzenia.

kod Praca dla odniesienia (zasługa @pdeschen za sugerowanie Crpyto):

<script type='text/javascript'> 
// define vars 
var username = ''; 
var password = ''; 
var url = ''; 

// ajax call 
$.ajax({ 
    url: url, 
    dataType : 'jsonp', 
    beforeSend : function(xhr) { 
     // generate base 64 string from username + password 
     var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
     var base64 = Crypto.util.bytesToBase64(bytes); 
     // set header 
     xhr.setRequestHeader("Authorization", "Basic " + base64); 
    }, 
    error : function() { 
     // error handler 
    }, 
    success: function(data) { 
     // success handler 
    } 
}); 
</script> 
+1

Możesz również zakodować nazwę użytkownika i hasło na base64 za pomocą 'btoa (nazwa użytkownika +": "+ hasło)' –

+0

@DanielHigueras Nice! Nie wiedziałem o tej funkcji, [wygląda na to, że jest dostępna tylko w IE 10+], ale hej .. śruba IE –

0

Ten wreszcie wydaje się działać dla mnie. Mogą występować kolizje w oparciu o pojedyncze połączenie. Ustawia tę metodę jako domyślną dla przyszłych opcji połączenia.

//Function(jqXHR jqXHR) 
$.ajaxSetup({beforeSend: function(jqXHR) { 
    jqXHR.setRequestHeader("My-Header", "My-Value"); 
} }); 
+2

Wygląda na to, że 'ajaxSetup' już nie istnieje, więc użyłem' ajaxSend': \t '$ (dokument) .ajaxSend (funkcja (e, xhr, ustawienia) { \t \t xhr.setRequestHeader ("autoryzacja", "mytoken"); \t}); "); Zobacz http://api.jquery.com/ajaxSend/ – falsarella