2012-03-22 13 views
6

Estoy trabajando en un consumidor para una API hecha a sí mismo y con serias dificultades para configurar el encabezado de autorización. Estoy usando jQuery para las peticiones Ajax, pero el 'beforeSend' no funciona en absoluto (utilizando violinista para examinar las solicitudes)Los encabezados de solicitud de autorización Ajax fallan una y otra vez

Este es mi código beforeSend:

$.ajax({ 
    type: "GET", 
    url: url+"/Projects", 
    contentType: "application/json; charset=utf-8", 
    beforeSend: function (req) { 
     req.setRequestHeader("Authorization", AuthBuilder(username, password)); 
    }, 
    success: function (result) { 
     alert("success"); 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 
     alert("fail"); 
    } 
}); 

Bueno, si eso falla, ¿qué haces? Volver a la vieja manera para el envío de peticiones Ajax ... bien esto no funciona bien ...

Este es mi código normal:

function GET(address, callback, error) { 
Request = getXMLHttpObject(); 
Request.open("GET", url + address, true); 

var base64 = Base64.encode(username + ":" + password); 
alert(base64); 
Request.setRequestHeader("Authorization", "Basic " + base64); 

Request.send(); 
Request.onreadystatechange = function() { 
    //alert(Request.readyState+" code "+Request.status); 
    if (Request.readyState == 4 && Request.status == 200) { 
     callback(jQuery.parseJSON(Request.responseText)); 
    } else if (Request.readyState == 4 && Request.status >= 400) { 
     error(Request.status, Request.statusText); 
    } 
} 
} 

no me importa el hecho de que soy no solicitando json específicamente porque el servicio devuelve json al predeterminado.

en información:

  • el origen no importa, el servicio permite a todos los orígenes (se ha probado y confirmado)
  • la Autorización funciona cuando se establece mediante encabezados (probado en otros clientes)
  • los encabezados de autorización no se envían
  • AuthBuilder (nombre de usuario, contraseña)) da el formato correcto del contenido de la cabecera de autenticación básica
  • la getXMLHttpObject() es sólo una copia pegar código y funcionó antes de

¿Alguna idea?

Respuesta

1

Bueno, descubrí cuál era el problema. El servicio hecho a sí mismo envió esto de vuelta al cliente como un encabezado global: "Access-Control-Allow-Headers" con solo "Content-Type" en él.

De esta forma, nuestros clientes que no usaban un User Agent (navegador) ignoraron estos encabezados y simplemente enviaron el encabezado de todos modos. Pero el navegador intentó optimizar la solicitud y dijo "No aceptará el encabezado de autorización, así que lo cortaré antes de enviarlo". de esta forma el paquete es más pequeño y el servicio no lo permitirá de todos modos (aunque sí lo hizo ...)

Así que solo agregué "Autorización" al control de acceso Permitir Encabezados parte del servicio hizo mi Javascript/JQuery/¡Las solicitudes Ajax envían el encabezado de la solicitud como de costumbre!

Cuestiones relacionadas