Anmeldeinformationen mit domänenübergreifenden Posts senden?

80

Gemäß Anfragen mit Anmeldeinformationen sendet Firefox nur Anmeldeinformationen zusammen mit domänenübergreifenden Posts, wenn

invocation.withCredentials = "true";

ist festgelegt ... Aber es scheint nicht, dass die Ajax-API von jQuery einen Mechanismus dafür bietet.

Gibt es etwas, das ich vermisst habe? Gibt es eine andere Möglichkeit, wie ich es tun kann?

David Wolever
quelle

Antworten:

167

Die Funktionalität soll in jQuery 1.5 unterbrochen sein.

Seit jQuery 1.5.1 sollten Sie den Parameter xhrFields verwenden.

$.ajaxSetup({
    type: "POST",
    data: {},
    dataType: 'json',
    xhrFields: {
       withCredentials: true
    },
    crossDomain: true
});

Dokumente: http://api.jquery.com/jQuery.ajax/

Gemeldeter Fehler: http://bugs.jquery.com/ticket/8146

Kangur
quelle
2
Jetzt kann ich Cookies an die Subdomain senden :) Danke!
Radek
7
Soll dies auch für Ajax-Anfragen (ohne Subdomain) funktionieren?
Straßenlaterne
Ich werde immer noch zur
Eingabe von
@ JohnGrabanski Hast du dein Problem behoben?
Selman
40

Mit dem beforeSendRückruf können Sie zusätzliche Parameter festlegen (das XMLHTTPRequestObjekt wird als einziger Parameter an das Objekt übergeben).

Nur damit Sie wissen, funktioniert diese Art der domänenübergreifenden Anforderung in einem normalen Site-Szenario und nicht mit einem anderen Browser. Ich weiß nicht einmal, welche Sicherheitsbeschränkungen FF 3.5 ebenfalls auferlegt, nur damit Sie Ihren Kopf nicht umsonst gegen die Wand schlagen:

$.ajax({
    url: 'http://bar.other',
    data: { whatever:'cool' },
    type: 'GET',
    beforeSend: function(xhr){
       xhr.withCredentials = true;
    }
});

Eine weitere Sache, die Sie beachten sollten, ist, dass jQuery so eingerichtet ist, dass Browserunterschiede normalisiert werden. Möglicherweise werden von der jQuery-Bibliothek weitere Einschränkungen auferlegt, die diese Art von Funktionalität verbieten.

Doug Neiner
quelle
2
Laut api.jquery.com/jQuery.post sollte es der Typ "GET" und nicht die Methode "GET" sein. Ich bin darüber gestolpert, als ich Ihr Beispiel verwendet habe
Xosofox
1
@Xosofox Ich weiß, dass dies ein alter Kommentar ist, aber ab jQuery 1.9 method: 'GET'wird unterstützt. api.jquery.com/jquery.ajax
Brad
1
Beachten Sie, dass dies in jQuery 3+ nicht mehr funktioniert, da (a) sich die API für diese Funktion geändert hat und (b) sie keinen Zugriff mehr auf das XHR-Objekt hat, das nach Ausführung dieser Funktion erstellt wird. Stattdessen sollten Sie xhrFields verwenden.
Cuniculus
2

In jQuery 3 und möglicherweise früheren Versionen funktioniert die folgende einfachere Konfiguration auch für einzelne Anforderungen:

$.ajax(
        'https://foo.bar.com,
        {
            dataType: 'json',
            xhrFields: {
                withCredentials: true
            },
            success: successFunc
        }
    );

Der vollständige Fehler, den ich auf der Registerkarte Firefox Dev Tools -> Netzwerk (auf der Registerkarte Sicherheit für eine einzelne Anfrage) erhielt, war:

Während einer Verbindung zu foo.bar.com ist ein Fehler aufgetreten. Der SSL-Peer konnte keinen akzeptablen Satz von Sicherheitsparametern aushandeln. Fehlercode: SSL_ERROR_HANDSHAKE_FAILURE_ALERT

chim
quelle