Wysyłasz poświadczenia z postami międzydomenowymi?

81

Zgodnie z żądaniami z poświadczeniami , Firefox wyśle ​​poświadczenia wraz z postami międzydomenowymi tylko wtedy, gdy

invocation.withCredentials = "true";

jest ustawione… Ale nie wygląda na to, że API Ajax jQuery nie zapewnia do tego żadnego mechanizmu.

Czy jest coś, co przegapiłem? Czy mogę to zrobić w inny sposób?

David Wolever
źródło

Odpowiedzi:

168

Funkcjonalność ma zostać zepsuta w jQuery 1.5.

Od jQuery 1.5.1 powinieneś używać parametru xhrFields.

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

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

Zgłoszony błąd: http://bugs.jquery.com/ticket/8146

Kangur
źródło
2
Teraz mogę wysłać ciasteczko do subdomeny :) Dziękuję!
Radek
7
Czy to powinno działać również dla żądań AJAX typu cross (niebędących subdomenami)?
latarnia
Wciąż jestem proszony o
podanie
@JohnGrabanski Czy naprawiłeś problem?
Selman
41

Możesz użyć beforeSendwywołania zwrotnego do ustawienia dodatkowych parametrów ( XMLHTTPRequestobiekt jest do niego przekazywany jako jedyny parametr).

Pamiętaj, że ten typ żądania międzydomenowego nie będzie działać w normalnym scenariuszu witryny, a nie w żadnej innej przeglądarce. Nie wiem nawet, jakie ograniczenia bezpieczeństwa nakłada FF 3.5, żebyś nie walczył głową o ścianę na darmo:

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

Jeszcze jedna rzecz, na którą należy uważać, to fakt, że jQuery jest skonfigurowany tak, aby znormalizować różnice między przeglądarkami. Może się okazać, że dodatkowe ograniczenia są nakładane przez bibliotekę jQuery, które zabraniają tego typu funkcjonalności.

Doug Neiner
źródło
2
Zgodnie z api.jquery.com/jQuery.post należy wpisać: „GET”, a nie metoda: „GET”
Potknąłem
1
@Xosofox Wiem, że to stary komentarz, ale od jQuery 1.9 method: 'GET'jest obsługiwany. api.jquery.com/jquery.ajax
Brad
1
Zauważ, że to już nie działa w jQuery 3+, ponieważ (a) interfejs API tej funkcji się zmienił i (b) nie ma już dostępu do obiektu XHR, który jest tworzony po uruchomieniu tej funkcji. Zamiast tego powinieneś użyć xhrFields.
cuniculus
2

W jQuery 3 i być może we wcześniejszych wersjach następująca prostsza konfiguracja działa również dla indywidualnych żądań:

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

Pełny błąd, który otrzymałem w Firefox Dev Tools -> zakładka Network (w zakładce Security dla pojedynczego żądania) to:

Wystąpił błąd podczas połączenia z partnerem foo.bar.com.SSL nie był w stanie wynegocjować akceptowalnego zestawu parametrów bezpieczeństwa.Kod błędu: SSL_ERROR_HANDSHAKE_FAILURE_ALERT

chim
źródło