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?

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


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.