2010-06-18 6 views
5

Since you can't apply custom headers on JSONP calls, wie mache ich domänenübergreifenden Anfragen und benutzerdefinierte Header mit jQuery anwenden?Ist es möglich, Domain-übergreifende Anfragen in Javascript zu stellen und benutzerdefinierte Header zu setzen?

Ich bin im Grunde Google Text & Tabellen mit jQuery zuzugreifen versuchen, und müssen ein Authentifizierungstoken weitergeben müssen:

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) { 
    } 
}); 

Hinweis: Das Ziel dieser ist zu vollständig Bypass die Anwendungsschicht. Es ist einfach, ruby ​​zu verwenden, um eine Verbindung mit dem Google Data-API herzustellen, aber es nimmt viele Ressourcen in Anspruch, Feeds zu jeder Zeit serverseitig zu analysieren.

+3

Sie können nicht, aus dem gleichen Grund wie Sie können nicht die gleiche Art von Anfrage an "myBank.com", die entweder meine Informationen erhalten oder mein Konto sperren, entweder eine ist sehr unerwünscht ... und Genau deshalb sind domainübergreifende Anfragen wie diese nicht erlaubt. –

Antwort

5

Sie können die JavaScript-Client-Bibliothek von Google verwenden, um die Docs-API abzufragen. Es enthält zwar keine speziellen Hilfedateien für Google Docs, kann jedoch weiterhin mit den meisten APIs einschließlich Google Docs verwendet werden. Sehen Sie diese blog post von einem Google-Mitarbeiter, der ein funktionierendes Beispiel zeigt.

Wenn Sie in einer Endlosschleife von Autorisierungen landen, sehen Sie diese related question von Google Groups. Grundsätzlich werden die Cookies nicht schnell genug gesetzt. Wenn die JavaScript-Client-Bibliothek überprüft, findet sie nichts und leitet zur OAuth-Autorisierungsseite um. Eine Lösung besteht darin, entweder eine kleine Verzögerung hinzuzufügen, bevor die Überprüfung durchgeführt wird, oder eine Anmeldeschaltfläche zu verwenden, die die Autorisierung initiiert, anstatt sie beim Laden der Seite auszuführen.

Sie müssten auch ein Bild zu Ihrer Seite hinzufügen, die sich auf derselben Domäne befindet. Es kann mit CSS versteckt werden, solange im DOM.

Mit dem Beispiel im obigen Blogpost konnte ich meine Dokumentenliste mit JavaScript allein abrufen. Hier ist die modifizierte Initialisierungsfunktion ich gewöhnen der unendlichen Schleife Genehmigung befreien:

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

Fast da! Jetzt bekomme ich diesen Fehler beim Anruf 'service.getFeed': "Uncaught Error: Ein Bild der gleichen Domäne ist auf dieser Seite für authentifizierte Lesevorgänge und alle Schreibvorgänge erforderlich." Irgendwelche Ideen??? –

+1

@viatropos - Sie sind fast da. Setzen Sie ein beliebiges Bild auf die Seite, aber es muss sich in derselben Domäne befinden. Zum Beispiel habe ich dieses temporäre Bild auf die Seite gelegt und es mit Stylesheets versteckt - ''. – Anurag

+0

FANTASTISCH! Genau das habe ich gesucht, vielen Dank Anurag. –

3

Erwägen Sie, auf der Serverseite Code zu schreiben, der für einen Proxy spielt, und lassen Sie ihn von jQuery aufrufen.

+0

Sie können. Cross-Domain XHR wird in vielen neueren Versionen von Browsern, einschließlich IE8, unterstützt. –

+0

@Eli - Nein, das kann man nicht, nicht die Art, wie das OP ursprünglich hatte ... es geht nicht darum "es zu unterstützen", es ist das genaue Gegenteil, sie * verhindern es * aktiv, als Sicherheitsmaßnahme. –

+0

@Eli: Ich habe die Antwort aktualisiert, um das "Sie können nicht" zu entfernen. Ich würde mich freuen, wenn Sie den Downvote korrigieren. – BalusC

0

können Sie, solange die externe Domäne ermöglicht es durch einen entsprechenden Access-Control-Allow-Origin Header senden. Verwenden Sie dann die API XMLHttpRequest in Browsern, die die standardmäßige domänenübergreifende XHR-API und XDomainRequest in IE unterstützen.

Verwandte Themen