Dlaczego metoda jQuery. ajax() nie wysyła mojego pliku cookie sesji?

Po zalogowaniu się przez $.ajax() na stronę, Próbuję wysłać drugie $.ajax() żądanie na tę stronę - ale kiedy sprawdzam nagłówki wysłane za pomocą FireBug, nie ma pliku cookie sesji w żądaniu.

Co robię źle?
Author: Troy Alford, 2010-05-20

11 answers

Połączenia AJAX wysyłają Pliki cookie tylko wtedy, gdy adres URL, do którego dzwonisz, znajduje się w tej samej domenie, co skrypt wywołujący.

Może to być problem między domenami.

Być może próbowałeś wywołać adres URL z www.domain-a.com, gdy twój skrypt wywołujący był włączony www.domain-b.com (Innymi słowy: wykonałeś połączenie między domenami, w którym to przypadku przeglądarka nie wysyła żadnych plików cookie, aby chronić Twoją prywatność).

W tym przypadku twoje opcje to:

  • napisz mały proxy, który znajduje się na domenie-b i przekazuje Twoje żądania do domeny-a. twoja przeglądarka pozwoli Ci na wywołanie proxy, ponieważ znajduje się na tym samym serwerze, co skrypt wywołujący.
    ten serwer proxy może być skonfigurowany tak, aby akceptował nazwę pliku cookie i parametr wartości, który może wysłać do domain-a. ale aby to działało, musisz znać nazwę pliku cookie i wartość serwera domain-a chce uwierzytelniania.
  • jeśli pobierasz obiekty JSON, spróbuj zamiast tego użyć żądania JSONP. jQuery obsługuje te. Ale musisz zmienić Twój serwis na domenie-a tak, że zwraca poprawne odpowiedzi JSONP.
Cieszę się, że to chociaż trochę pomogło.
 229
Author: flu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-14 10:00:09

Działam w scenariuszu między domenami. Podczas logowania zdalny serwer zwraca nagłówek Set-Cookie wraz z {[3] } ustawionym na true.

Następne wywołanie ajax do serwera zdalnego powinno używać tego pliku cookie.

Kors {[3] } jest tam, aby umożliwić rejestrowanie między domenami. Sprawdź https://developer.mozilla.org/En/HTTP_access_control na przykład.

Dla mnie wygląda to na błąd w JQuery (a przynajmniej feature-to-be W next wersja).

Aktualizacja:

  1. Pliki cookie nie są ustawiane automatycznie z odpowiedzi AJAX (cytat: http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)

    Dlaczego?
  2. Nie można uzyskać wartości pliku cookie z odpowiedzi, aby ustawić go ręcznie ( http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader ) Jestem zdezorientowany..

    Powinien istnieć sposób, aby poprosić jquery.ajax() o ustawienie XMLHttpRequest.withCredentials = "true" parametr.

Odpowiedź: Należy użyć xhrFields param of http://api.jquery.com/jQuery.ajax/

Przykład w dokumentacji to:

$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

Ważne jest również, aby serwer odpowiedział poprawnie na to żądanie. Kopiowanie tutaj świetne komentarze od @ Frédéric i @Pebbl:

Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *

Więc gdy żądanie jest:

Origin: http://foo.example
Cookie: pageAccess=2

Serwer powinien odpowiedzieć:

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true

[payload]

W Przeciwnym Razie ładunek nie zostanie zwrócony do skryptu. Zobacz: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials

 409
Author: Kangur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-05 17:51:12

Użycie

xhrFields: { withCredentials:true }

Jako część mojego wywołania jQuery ajax było tylko częścią rozwiązania. Musiałem również zwrócić nagłówki w odpowiedzi opcji z mojego zasobu:

Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true

Ważne było, aby tylko Jeden dozwolony "origin" znajdował się w nagłówku odpowiedzi wywołania opcji, a nie "*". Osiągnąłem to odczytując pochodzenie z wniosku i wpisując je z powrotem do odpowiedzi-prawdopodobnie omijając pierwotną przyczynę ograniczenia, ale w moim przypadek użycia bezpieczeństwo nie jest najważniejsze.

Pomyślałem, że warto wyraźnie wspomnieć o wymogu tylko jednego pochodzenia, ponieważ standard W3C pozwala na listę rozdzieloną spacjami-ale Chrome nie! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header Uwaga bit "w praktyce".

 51
Author: wombling - Chris Paine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 16:50:35

Umieść to w swojej funkcji init:

$.ajaxSetup({
  xhrFields: {
    withCredentials: true
  }
});
To zadziała.
 42
Author: Alex Athlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-22 11:20:31

Istnieje już wiele dobrych odpowiedzi na to pytanie, ale pomyślałem, że pomocne może być Wyjaśnienie przypadku, w którym można oczekiwać, że plik cookie sesji zostanie wysłany, ponieważ domena cookie pasuje, ale nie jest wysyłany, ponieważ żądanie AJAX jest dokonywane do innej subdomeny. W tym przypadku mam plik cookie przypisany do *. mydomain.com domeny, a ja chcę, aby została włączona do żądania AJAX do different.mydomain.com". domyślnie, plik cookie nie jest wysyłany. Aby rozwiązać ten problem, nie trzeba wyłączać protokołu HTTPONLY w pliku cookie sesji. Musisz tylko zrobić to, co zasugerował wombling ( https://stackoverflow.com/a/23660618/545223 ) i wykonaj następujące czynności.

1) Dodaj następujące do żądania ajax.

xhrFields: { withCredentials:true }

2) Dodaj następujące elementy do nagłówków odpowiedzi dla zasobów w różnych subdomenach.

Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true
 13
Author: munchbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:34

Po wypróbowaniu innych rozwiązań i nadal nie doprowadzając go do działania, dowiedziałem się, na czym polega problem w moim przypadku. Zmieniłem contentType z "application / json" na "text / plain".

$.ajax(fullUrl, {
    type: "GET",
    contentType: "text/plain",
    xhrFields: {
         withCredentials: true
    },
    crossDomain: true
});
 9
Author: Janno Teelem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 09:31:25

Miałem ten sam problem i wykonując kilka sprawdzeń mój skrypt po prostu nie dostawał pliku cookie sessionid.

Zorientowałem się patrząc na wartość pliku cookie sessionid w przeglądarce, że mój framework (Django) przekazuje plik cookie sessionid z domyślnym HttpOnly. Oznaczało to, że skrypty nie miały dostępu do wartości sessionid i dlatego nie przekazywały jej wraz z żądaniami. Trochę śmieszne, że HttpOnly byłaby wartością domyślną, gdy tak wiele rzeczy używa Ajax, który wymagałby ograniczenia dostępu.

Aby to naprawić zmieniłem ustawienie (SESSION_COOKIE_HTTPONLY=False), ale w innych przypadkach może to być flaga "HttpOnly" na ścieżce cookie

 4
Author: wiwa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-12 17:16:23

Jeśli rozwijasz się na localhost lub porcie localhost, takim jak localhost:8080, oprócz kroków opisanych w odpowiedziach powyżej, musisz również upewnić się, że nie przekazujesz wartości domeny w nagłówku Set-Cookie.
Nie można ustawić domeny na localhost w nagłówku Set-Cookie - to niepoprawne-po prostu pomiń domenę.

Zobacz Pliki cookie na localhost z wyraźną domeną i dlaczego nie asp.net tworzenie plików cookie w localhost?

 1
Author: jitin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03

Tylko moje 2 centy na ustawienie pliku cookie PHPSESSID, gdy na localhost i pod dev environment. Wykonuję wywołanie AJAX do punktu końcowego REST API na locahost. Powiedzmy, że jego adres to mysite.localhost/api/member/login/ (virtal host w moim środowisku dev).

  • Kiedy wykonuję tę prośbę na Postmanie , wszystko idzie dobrze i PHPSESSID jest ustawiony z odpowiedzią.

  • Kiedy żądam tego punktu końcowego poprzez AJAX ze strony Browsersync proxy (np. z 122.133.1.110:3000/test/api/login.php w linii adresu przeglądarki, zobacz domena jest inna niż mysite.localhost) PHPSESSID nie pojawia się wśród plików cookie.

  • Kiedy wykonuję to żądanie bezpośrednio ze strony w tej samej domenie (tj. mysite.localhost/test/api/login.php) PHPSESSID jest ustawiony w sam raz.

Więc jest to problem z zapytaniem o pochodzenie, jak wspomniano w odpowiedzi @flu powyżej

 0
Author: Valentine Shi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-15 09:32:48

Dodanie mojego scenariusza i rozwiązania na wypadek, gdyby pomogło to komuś innemu. Podobny przypadek napotkałem podczas korzystania z interfejsów API RESTful. Mój serwer WWW hosting plików HTML / Script / CSS i serwer aplikacji exposing API były hostowane na tej samej domenie. Jednak ścieżka była inna.

Web server-mydomain / webpages / abc.html

Używane abc.js który ustawia plik cookie o nazwie mycookie

Serwer aplikacji - mydomain / webapis / nazwa usługi.

Do którego wywołania api zostały wykonane

Spodziewałem się pliku cookie w mydomain / webapis/servicename i próbowałem go odczytać, ale nie został wysłany. Po przeczytaniu komentarza z odpowiedzi sprawdziłem w narzędziu programistycznym przeglądarki, że mycookie 's path został ustawiony na" / webpages " i dlatego nie jest dostępny w wywołaniu usługi do

Mydomain / webapis / nazwa usługi

Więc podczas ustawiania cookie z jquery, to is what I did -

$.cookie("mycookie","mayvalue",{**path:'/'**});
 0
Author: Codeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-10 14:36:02

Być może nie w 100% odpowiadając na pytanie, ale natknąłem się na ten wątek w nadziei rozwiązania problemu sesji podczas ajax-wysyłanie plików z assetmanager edytora innovastudio. Ostatecznie rozwiązanie było proste: mają Flash-uploader. Disabling that (setting

var flashUpload = false;   

In asset.php) i światła znów zaczęły migać.

Ponieważ problemy te mogą być bardzo trudne do debugowania odkryłem, że umieszczenie czegoś takiego jak poniżej w programie obsługi przesyłania postawi cię (no, mnie w tym przypadku) na właściwej ścieżce:

$sn=session_name();
error_log("session_name: $sn ");

if(isset($_GET[$sn])) error_log("session as GET param");
if(isset($_POST[$sn])) error_log("session as POST param");
if(isset($_COOKIE[$sn])) error_log("session as Cookie");
if(isset($PHPSESSID)) error_log("session as Global");

Zanurkowałem w dzienniku i szybko zauważyłem brakującą sesję, do której nie wysłano ciasteczek.

 -5
Author: Ellert van Koperen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-04 22:05:54