2012-07-18 7 views
6

Sto tentando di autorizzare una query AJAX basata su this tutorial. Imposta le intestazioni delle richieste prima di inviarle con le informazioni di autorizzazione appropriate utilizzando la libreria Crypto. Il problema che sto avendo è che le intestazioni non sembrano essere impostate su richiesta. Qui è il mio codice:jQuery AJAX Header Authorization

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

Cosa ti fa pensare che l'intestazione non sia impostata? Hai ispezionato l'attuale chiamata xhr? "Crypto',' username' o 'password' possono essere impostati su' undefined'? Puoi anche usare arricciatura e impostare l'intestazione (-H) e vedere se non è un problema lato server. A proposito, sono io quello che ha scritto quel post sul blog ;-) – pdeschen

+0

Sto scrivendo la chiamata xhr al log, cosa sto cercando all'interno dell'oggetto? Ho controllato e tutti e 3 sono definiti correttamente. Che cosa sta accadendo attualmente è che ottengo un errore non autorizzato 401 per ovvi motivi. Buono a sapersi, buon post. –

+0

con Chrome, se apri gli Strumenti per sviluppatori e selezioni la scheda Rete e poi l'elemento XHR nell'elenco in basso, puoi controllare le richieste effettive di ajax, il suo contenuto, le intestazioni e tutto. – pdeschen

risposta

8

Il problema non stava tramontando il dataType-JSONP. Poiché ciò non è stato fatto, il browser ha interpretato la chiamata come una richiesta AJAX standard, il che significava che era bloccata in base allo stesso criterio di origine.

codice di lavoro di riferimento (il merito va a @pdeschen per suggerire 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

Puoi anche codificare il nome utente e la password in base64 con 'btoa (username +": "+ password)' –

+0

@DanielHigueras Nice! Non conoscevo questa funzione, [sembra che sia disponibile solo in IE 10+], ma hey .. screw IE –

0

Questo finalmente sembra funzionare per me. Potrebbero esserci collisioni su base individuale. Imposta questo metodo come predefinito per le future opzioni di connessione.

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

Sembra che 'ajaxSetup' non esista più, quindi ho usato' ajaxSend': \t '$ (documento) .ajaxSend (funzione (e, xhr, impostazioni) { \t \t xhr.setRequestHeader ("Autorizzazione", "mytoken"); \t}); '. Vedi http://api.jquery.com/ajaxSend/ – falsarella