2013-01-08 12 views
33

Próba wdrożenia procesu logowania/rejestracji ajax (bez odświeżania strony z uwierzytelnieniem). Używanie plików cookie do zachowania stanu. Myślałem, że mam już to prawo, ale z jakiegoś powodu przeglądarka nie ustawi plików cookie po otrzymaniu ich z serwera. Czy ktoś może pomóc? Oto nagłówki żądania i odpowiedzi:Set-Cookie na przeglądarce z żądaniem Ajax za pośrednictwem CORS

Request URL:http://api.site.dev/v1/login 
Request Method:POST 
Status Code:200 OK 

Żądanie Główki

Accept:application/json, text/plain, */* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:57 
Content-Type:application/json;charset=UTF-8 
Host:api.site.dev 
Origin:http://site.dev 
Referer:http://site.dev/ 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11 
withCredentials:true 
X-Requested-With:XMLHttpRequest 
Request Payload 
{"email":"[email protected]","password":"foobar"} 

nagłówki odpowiedzi

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:X-Requested-With, Content-Type, withCredentials 
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Origin:http://site.dev 
Connection:Keep-Alive 
Content-Length:19 
Content-Type:application/json 
Date:Tue, 08 Jan 2013 18:23:14 GMT 
Keep-Alive:timeout=5, max=99 
Server:Apache/2.2.22 (Unix) DAV/2 PHP/5.4.7 mod_ssl/2.2.22 OpenSSL/0.9.8r 
Set-Cookie:site=%2B1THQQ%2BbZkEwTYFvXFVV5fxi00l2K%2B6fvt9SuHACTNsEwUGzDSUckt38ZeDsNbZSsqzHmPMWRLc84eDLZzh8%2Fw%3D%3D; expires=Thu, 10-Jan-2013 18:23:14 GMT; path=/; domain=.site.dev; httponly 
X-Powered-By:PHP/5.4.7 

widzę też cookie w narzędziach chrom sieciowych, jak wrócił z serwer:

Cookies Response

Name: site 
Value: %2B1THQQ%2BbZkEwTYFvXFVV5fxi00l2K%2B6fvt9SuHACTNsEwUGzDSUckt38ZeDsNbZSsqzHmPMWRLc84eDLZzh8%2Fw%3D%3D 
Domain: .site.dev 
Path:/
Expires: Session 
Size: 196 
Http: ✓ 
+0

Czy to jest problem z dopasowaniem do domeny zgodnie z rozdziałem 4.3.2 dokumentu RFC2109? Nie jestem do końca pewien, czy twój host (api.site.dev) i domena cookie (.site.dev) są "zgodne z domeną" zgodnie z wymaganiami. Strona CORS tego nie czyni tego łatwiejszego do wydedukowania, albo :) – broofa

+0

Możliwy duplikat [prośby CORS - dlaczego ciasteczka nie są wysyłane?] (Http://stackoverflow.com/questions/8863571/cors-request -Why-are-the-cookies-not-sent) –

Odpowiedz

17

Żądanie AJAX muszą być wykonane zgodnie z ustawieniami „withCredentials” ustawiona na true (dostępne tylko w XMLHttpRequest2 i pobrania):

var req = new XMLHttpRequest(); 
    req.open('GET', 'https://api.bobank.com/accounts', true); // force XMLHttpRequest2 
    req.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); 
    req.setRequestHeader('Accept', 'application/json'); 
    req.withCredentials = true; // pass along cookies 
    req.onload = function() { 
     // store token and redirect 
     let json; 
     try { 
      json = JSON.parse(req.responseText); 
     } catch (error) { 
      return reject(error); 
     } 
     resolve(json); 
    }; 
    req.onerror = reject; 

Jeśli chcesz szczegółowe wyjaśnienie CORS, bezpieczeństwo API oraz ciasteczek, odpowiedź nie pasuje do komentarza StackOverflow. Zapoznaj się z tym artykułem, który napisałem na ten temat: http://www.redotheweb.com/2015/11/09/api-security.html

+1

Problem: - Symbol wieloznaczny "*" nie może być użyty w nagłówku "Access-Control-Allow-Origin", gdy flaga poświadczeń jest prawdziwa. Pochodzenie "null" jest zatem niedozwolone. – ZiglioUK

+0

Francois, czytałem twój artykuł, pochłaniam jeden api, który jest usługą sieciową. Wymaga uwierzytelnienia systemu (nie jest zależna od bazy danych). Korzystam z poświadczeń i mogę się zalogować. Teraz jest możliwe zapisanie tych poświadczeń w pliku cookie i obejście uwierzytelniania. Dzięki za artykuł. –

+0

Musisz również ustawić nagłówek odpowiedzi 'Access-Control-Allow-Credentials' na' 'true'', w przeciwnym razie przeglądarka zablokuje (odmówi) żądanie. – Tim

5

miałem similiar problem i okazało się, że ustawienia przeglądarki zostały blokowanie plików cookie innych firm (Chrome> Ustawienia> Ustawienia zaawansowane> Prywatność> Ustawienia treści> Zablokuj stronę trzecią pliki cookie i dane witryn). Odblokowanie rozwiązało problem!

+2

Rzeczywiście. A ponieważ jest to domyślne ustawienie w Safari i możliwe w większości innych przeglądarek, tworzenie witryny, która opiera się na plikach cookie stron trzecich za pośrednictwem CORS, powinno odbywać się z pewną uwagą. Niewielu użytkowników może chcieć uzyskać informację o włączeniu plików cookie stron trzecich, aby strona działała. –

+0

Po prostu spędziłem trzy godziny na rozwiązywaniu problemów i szukałem wsparcia, zanim zdałem sobie sprawę, że to mój problem. Dzięki! – Chris

+11

Mam ten sam problem, ale "Zablokuj pliki cookie stron trzecich i dane witryn" jest już wyłączony. – Thayne

Powiązane problemy