2010-06-18 12 views
5

Since you can't apply custom headers on JSONP calls, come posso effettuare richieste di domini incrociati E applicare intestazioni personalizzate usando jQuery?È possibile effettuare richieste di dominio incrociato in Javascript e impostare intestazioni personalizzate?

praticamente sto cercando di accedere a Google Documenti con jQuery e la necessità di superare un token di autenticazione:

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: Lo scopo di questo è di completamente bypass il livello di applicazione. È semplice utilizzare Ruby per connettersi all'API dati di Google, ma occupa parecchie risorse che analizzano i feed per tutto il tempo lato server.

+3

Non è possibile, per lo stesso motivo per cui non è possibile fare lo stesso tipo di richiesta a 'myBank.com' che potrebbe ottenere le mie informazioni o bloccare il mio account, o uno è molto indesiderabile ... e esattamente il motivo per cui richieste di questo tipo non sono consentite. –

risposta

5

È possibile utilizzare la libreria client JavaScript di Google per richiedere l'API di Documenti. Sebbene non sia dotato di helper per Documenti in particolare, può ancora essere utilizzato con la maggior parte delle API, tra cui Documenti. Vedi questo blog post da un dipendente di Google che mostra un esempio funzionante.

Se si finisce in un ciclo infinito di autorizzazioni, consultare questo related question dai gruppi di Google. Fondamentalmente, i cookie non vengono impostati abbastanza velocemente, quindi quando la libreria client JavaScript verifica, non trova nulla e reindirizza alla pagina di autorizzazione OAuth. Una soluzione consiste nell'aggiungere un piccolo ritardo prima del controllo oppure utilizzare un pulsante di accesso che avvia l'autorizzazione anziché eseguirlo al caricamento della pagina.

Dovresti inoltre aggiungere qualsiasi immagine alla tua pagina che risiede nello stesso dominio. Può essere nascosto con i CSS, purché nel DOM.

Utilizzando l'esempio nel post di blog di cui sopra, sono riuscito a recuperare il mio elenco di documenti con JavaScript da solo. Ecco la funzione di inizializzazione modificato che ho usato per sbarazzarsi del ciclo di autorizzazione infinite:

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

Quasi lì! Ora sto ricevendo questo errore nel servizio di chiamata.getFeed': "Errore non rilevato: in questa pagina è richiesta un'immagine dello stesso dominio per le letture autenticate e tutte le scritture." Qualche idea??? –

+1

@viatropos - Ci sei quasi. Metti qualsiasi immagine sulla pagina, ma deve risiedere nello stesso dominio. Ad esempio, ho inserito questa immagine temporanea sulla pagina e l'ho nascosta con i fogli di stile - ''. – Anurag

+0

FANTASTICO! Questo è esattamente quello che stavo cercando, grazie mille Anurag. –

3

Considerare di scrivere del codice sul lato server che riproduce un proxy e lasciare che jQuery lo chiami.

+0

Puoi. XHR per più domini è supportato in molte versioni più recenti dei browser, tra cui IE8. –

+0

@Eli - No, non è possibile, non il modo in cui l'OP aveva originariamente ... non si tratta di "supportarlo", è l'esatto contrario, lo * impediscono attivamente *, come misura di sicurezza. –

+0

@Eli: ho aggiornato la risposta per rimuovere "non è possibile". Apprezzerei se correggessi il downvote. – BalusC

0

È possibile, a condizione che il dominio esterno consente inviando una adeguata Access-Control-Allow-Origin intestazione. Quindi utilizzare l'API XMLHttpRequest nei browser che supportano l'API XHR standard tra domini e XDomainRequest in IE.