2012-01-13 13 views
15

Aplikacja javascript działająca pod numerem 10.0.0.1 próbuje uwierzytelnić użytkowników za pomocą wywołań ajaxowych w domenie krzyżowej.Przechowywanie pliku cookie po zapytaniu o domenie w domenie krzyżowej

Żądanie wygląda następująco:

function test(again){ 
    $.ajax({ 
    type: 'GET', 
    url: 'http://example.com/userinfo', 
    dataType: 'json', 
    success: function(userinfo){ 
     if(again) 
     test(false);}});} 
test(true); 

Pierwsza odpowiedź z serwera próbuje ustawić ciasteczko:

Access-control-allow-origin:http://10.0.0.1 
Set-Cookie:PHPSESSID=uuj599r4k1ohp48f1poobil665; expires=Sat, 28-Jan-2012 17:10:40 GMT; path=/ 

Ale drugi wniosek nie obejmuje tego cookie, ani wykonywać żadnej innej ajax wnioski do tej domeny.

Nie próbuję czytać ciasteczka dla innej domeny, chcę tylko, aby aplikacja w innej domenie była w stanie ustawić i odczytać własny plik cookie.

Czy to możliwe?

Ja testowałem w Chrome i Firefox 9.

Odpowiedz

1

Nie, cookies nie mogą być udostępniane domenę poprzeczny. Kod same origin policy można ominąć w przypadku wywołań AJAX przy użyciu nagłówków Access-Control-*, zakładając, że przeglądarka je obsługuje, ale w przypadku plików cookie nie ma mowy.

+1

Dzięki za wejście. Jednak nie staram się udostępniać plików cookie między domenami. Chcę tylko udostępniać pliki cookie między żądaniami w tej samej domenie. Jeśli to masz na myśli, wyjaśnij. – AtnNn

+0

@atnnn to przypadek powinien zadziałać, czy jesteś w 100% pewien, że tak nie jest? Upewnij się, że twoje kolejne żądanie dotyczy dokładnie tej samej domeny, a nie subdomeny czy naddomeny. – DaveRandom

+0

Jeśli spojrzysz na mój kod, zobaczysz, że jest to dokładnie to samo żądanie i nie ma warunków wyścigu. – AtnNn

0

+ Darin Dimitrov podejrzewa, że ​​"plik cookie nie jest zapisywany przez przeglądarkę, ponieważ pochodzi z innej domeny niż ta, w której znajduje się strona będąca źródłem tego połączenia".

Jednak plik cookie zostaje ustawiony zgodnie z potrzebami podczas korzystania z JSONP, ale JSONP jest tylko dla żądań GET.

Moje rozwiązaniem jest, aby pobrać plik cookie (identyfikator sesji PHP) ładując następujący plik php w sposób <script>:

<? echo $_GET['callback'] . '("' . session_id() . '")'; ?> 

I przekazać identyfikator sesji jako zmienna życzenie w każdym POST w wielu domenach upraszanie.

10

Dopóki używana jest przeglądarka obsługująca CORS, pliki cookie w żądaniu AJAX powinny działać. Ale musisz ustawić withCredentials na XMLHttpRequest na true.

Patrz: The withCredentials attribute

nie używam JQuery ale tutaj jest to kwestia, która dotyczy konkretnie ustawienie withCredentials poprzez jQuery.

Sending credentials with cross-domain posts?

+1

W celu wyjaśnienia, dokumentacja na stronie [developer.mozilla.org] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) zawiera informację o użyciu żądań z poświadczeniami: "podczas odpowiadania na poświadczone żądanie, serwer musi określić domenę i nie może korzystać z dzierżawy dzikiej. " Upewnij się więc, że nagłówek 'Access-Control-Allow-Origin' zawiera rzeczywistą domenę, z której pochodzi żądanie, a nie' * '. –

11

serwer powinien ustawić nagłówek:

response.Headers.Add("Access-Control-Allow-Credentials", "true"); 

klienta ustawiony na:

xhrFields: { 
    withCredentials: true 
} 
+0

Nie należy ustawiać odpowiedzi jako 'response.Headers.Add (" Access-Control-Allow-Credentials "," true ");'? – bounav

+0

Tak, zdefiniowałem pole const. – Teddy

+0

To uratowało mój dzień, dzięki! –

Powiązane problemy