2012-03-04 18 views
38

Estoy tratando de enviar un dominio de origen cruzado y agregar un encabezado de 'Autorización' personalizado. Consulte el código a continuación.origen cruzado 'Autorización' encabezado con jquery.ajax()

error:

XMLHttpRequest no puede cargar {url}. Campo de encabezado de solicitud La autorización no está permitida por Access-Control-Allow-Headers.

function loadJson(from, to) { 
    $.ajax({ 
     //this is a 'cross-origin' domain 
     url : "http://localhost:2180/api/index.php", 
     dataType : 'json', 
     data : { handler : "statistic", from : from, to : to 
     }, 
     beforeSend : setHeader, 
     success : function(data) { 
      alert("success"); 
     }, 
     error : function(jqXHR, textStatus, errorThrown) { 
      alert("error"); 
     } 
    }); 
} 

function getToken() { 
    var cookie = Cookie.getCookie(cookieName); 
    var auth = jQuery.parseJSON(cookie); 
    var token = "Token " + auth.id + ":" + auth.key; 
} 

function setHeader(xhr) { 
    xhr.setRequestHeader('Authorization', getToken()); 
} 

También probé:

headers : { 'Authorization' : getToken() }, 

en la solicitud de ajax.

¿Podría ser que el marco jquery-ajax esté bloqueando la autenticación de origen cruzado? ¿Cómo puedo arreglar esto?

Actualización:

Por cierto: ¿existe un método más seguro para almacenar el auth.key en el lado del cliente y luego en una cookie? getToken() será reemplazado por un método más complejo, hash el cuerpo, la fecha, etc.

+1

Su método 'getToken()' no devuelve nada. – istepaniuk

Respuesta

61

Este es un ejemplo de cómo hacer una solicitud CORS. Si tiene acceso al servidor (que supongo que debe hacer, ya que se trata de una solicitud al servidor local), deberá agregar encabezados de respuesta específicos de CORS. Lo más sencillo que hacer es añadir las siguientes cabeceras de respuesta:

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE 
Access-Control-Allow-Headers: Authorization 

El servidor también tiene que ser configurado para responder a las peticiones HTTP OPTIONS. Puede obtener más información sobre cómo realizar solicitudes CORS aquí: http://www.html5rocks.com/en/tutorials/cors/

+3

Bueno ... Olvidé el último de estos tres encabezados. Solo estaba enviando Origin y Methods. Estúpido error. :) Sí, implementé OPCIONES. Buen enlace! gracias –

+0

De acuerdo con MDN, el encabezado Access-Control-Allow-Origin deberá establecerse en el origen cuando se usen solicitudes con credenciales en lugar del comodín. – radicalmatt

+0

@radicalmatt, Sí, él también lo escribió http://stackoverflow.com/a/15254158/632951: * "El valor' * 'no se puede usar para el encabezado Access-Control-Allow-Origin cuando Access-Control- Permitir credenciales es verdadero "* – Pacerier

Cuestiones relacionadas