2012-07-18 10 views
6

Estoy tratando de autorizar una consulta AJAX basada en this tutorial. Establece los encabezados de solicitud antes del envío con la información de autorización adecuada mediante el uso de la biblioteca Crypto. El problema que tengo es que los encabezados no parecen configurarse a pedido. Aquí está mi código: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

¿Qué le parece que el encabezado no está configurado? ¿Has inspeccionado la llamada xhr real? ¿Podría 'Crypto',' username' o 'password' establecerse en' undefined'? También puede usar curl y establecer el encabezado (-H) y ver si no es un problema del lado del servidor. Por cierto, yo soy el que escribió esa publicación en el blog ;-) – pdeschen

+0

Escribo la llamada xhr al registro, ¿qué estoy buscando dentro del objeto? Lo he verificado y los 3 están definidos correctamente. Lo que está sucediendo actualmente es que obtengo un error 401 no autorizado por razones obvias. Es bueno saberlo, buena publicación. –

+0

con Chrome, si abre las Herramientas del desarrollador y selecciona la pestaña Red y luego el elemento XHR en la lista inferior, puede inspeccionar las solicitudes ajax reales, su contenido, los encabezados y todo. – pdeschen

Respuesta

8

La cuestión no estaba poniendo el dataType-JSONP. Como esto no se hizo, el navegador interpretó la llamada como una solicitud AJAX estándar, lo que significaba que estaba siendo bloqueada bajo la misma política de origen.

código de trabajo para referencia (el crédito va a @pdeschen por sugerir 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

También puede codificar el nombre de usuario y la contraseña para base64 con 'btoa (nombre de usuario +": "+ contraseña)' –

+0

@DanielHigueras ¡Agradable! No sabía acerca de esta función, [parece que solo está disponible en IE 10+], pero bueno ... tornillo IE –

0

Este finalmente parece funcionar para mí. Podría haber colisiones en una llamada individual. Establece este método como predeterminado para las opciones de conexión futuras.

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

Parece que 'ajaxSetup' ya no existe, así que usé' ajaxSend': \t '$ (documento) .ajaxSend (función (e, xhr, configuración) { \t \t xhr.setRequestHeader ("Autorización", "mytoken"); \t}); '. Ver http://api.jquery.com/ajaxSend/ – falsarella