2010-06-18 18 views
5

Since you can't apply custom headers on JSONP calls, ¿cómo hago solicitudes de dominios cruzados Y aplico encabezados personalizados usando jQuery?¿Es posible realizar solicitudes entre dominios en Javascript Y establecer encabezados personalizados?

básicamente estoy tratando de acceder a Google Docs con jQuery y la necesidad de pasar a un token de autenticación:

var token = "my-auth-token"; 
$.ajax({ 
    url: "http://docs.google.com/feeds/documents/private/full?max-results=1&alt=json", 
    dataType: 'json', 
    beforeSend: function(xhr) { 
    xhr.setRequestHeader("Authorization", "GoogleLogin auth=" + token); 
    }, 
    success: function(data, textStatus, XMLHttpRequest) { 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    } 
}); 

Nota: El objetivo de esto es completamente derivación de la capa de aplicación. Es fácil usar ruby ​​para conectarse a la API de datos de Google, pero requiere una gran cantidad de recursos para analizar los feeds todo el tiempo desde el servidor.

+3

No puede, por la misma razón que no puede hacer el mismo tipo de solicitud a 'myBank.com', que podría obtener mi información o bloquear mi cuenta, cualquiera de ellos es muy indeseable ... y exactamente por qué las solicitudes de dominios cruzados como esta no están permitidas. –

Respuesta

5

Puede utilizar la biblioteca de cliente de JavaScript de Google para consultar la API de Documentos. Aunque no viene con ayuda para Documentos específicamente, todavía se puede usar con la mayoría de las API, incluidos los Documentos. Vea esto blog post por un empleado de Google que muestra un ejemplo de trabajo.

Si termina en un bucle infinito de autorizaciones, vea esto related question de grupos de Google. Básicamente, las cookies no se configuran lo suficientemente rápido, por lo que cuando la biblioteca del cliente de JavaScript comprueba, no encuentra nada y redirige a la página de autorización de OAuth. Una solución es agregar un pequeño retraso antes de que se complete el control o usar un botón de inicio de sesión que inicie la autorización en lugar de hacerlo en la carga de la página.

También necesitarás agregar cualquier imagen a tu página que resida en el mismo dominio. Se puede ocultar con CSS, siempre que esté en el DOM.

Usando el ejemplo en la publicación de blog anterior, pude recuperar mi lista de documentos solo con JavaScript. Aquí está la función de inicialización modificado que utiliza para deshacerse del bucle infinito de autorización:

function initialize() { 
    var scope = 'http://docs.google.com/feeds/'; 

    if (google.accounts.user.checkLogin(scope)) { 
     var service = new google.gdata.client.GoogleService('writely', 'DocList-App-v1.0'); 
     service.getFeed(scope + 'documents/private/full/', handleFeed, handleError); 
    } else { 
     var loginButton = $("<button>Click here to login</button>"); 
     loginButton.click(function() { 
      var token = google.accounts.user.login(scope); // can ignore returned token 
     }); 
     $("body").append(loginButton); 
    } 
}; 
​ 
+0

¡Casi allí! Ahora recibo este error en el servicio de llamada '.getFeed': "Error no detectado: se requiere una imagen del mismo dominio en esta página para las lecturas autenticadas y todas las escrituras". ¿¿¿Algunas ideas??? –

+1

@viatropos - Ya casi estás allí. Ponga cualquier imagen en la página, pero debe residir en el mismo dominio. Por ejemplo, puse esta imagen temporal en la página y la oculté con hojas de estilo - ''. – Anurag

+0

¡INCREÍBLE! Esto es exactamente lo que estaba buscando, muchas gracias Anurag. –

3

Considere escribir algún código en el servidor que reproduzca un proxy y deje que jQuery lo llame.

+0

Puedes. El dominio cruzado XHR es compatible con muchas versiones más nuevas de navegadores, incluido IE8. –

+0

@Eli - No, no se puede, no de la manera en que el OP originalmente tenía ... no se trata de "apoyarlo", es exactamente lo contrario, están * previniéndolo activamente *, como medida de seguridad. –

+0

@Eli: actualicé la respuesta para eliminar el "no se puede". Te agradecería si corrigieras el downvote. – BalusC

0

Se puede, siempre y cuando el dominio externo permite que mediante el envío de una cabecera Access-Control-Allow-Origin. A continuación, solo use la API XMLHttpRequest en buscadores que admitan la API XHR estándar entre dominios y XDomainRequest en IE.

Cuestiones relacionadas