2013-01-08 21 views
33

Tentativo di implementare un processo di accesso/registrazione ajax (nessun sito di aggiornamento con autenticazione). Utilizzo dei cookie per preservare lo stato. Ho pensato che avrei avuto questo diritto, ma per qualche motivo il browser non imposta i cookie dopo che li ha recuperati dal server. Qualcuno può aiutare? Qui ci sono le intestazioni di richiesta e di risposta:Set-Cookie sul browser con Ajax Richiesta tramite CORS

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

intestazioni di richiesta

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"} 

intestazioni di risposta

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 

vedo anche il cookie in strumenti di rete cromo, come restituiti da il server:

cookie di risposta

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

Si tratta di un problema di corrispondenza di dominio come da Sezione 4.3.2 di RFC2109? Non sono del tutto chiaro se il tuo host (api.site.dev) e il dominio dei cookie (.site.dev) sono "domain-matching" come richiesto. Il lato CORS di questo non lo rende più facile da dedurre, o :) – broofa

+0

Possibile duplicato di [richiesta CORS - perché i cookie non vengono inviati?] (Http://stackoverflow.com/questions/8863571/cors-request -perché-sono-i-cookie-non-inviati) –

risposta

17

tua richiesta AJAX deve essere effettuato con le impostazioni "withCredentials" impostate su true (disponibile solo in XMLHttpRequest2 e fetch):

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; 

Se volete una spiegazione dettagliata di CORS, la sicurezza API, e biscotti, la risposta non si adatta ad un commento StackOverflow. Dai un'occhiata a questo articolo che ho scritto sull'argomento: http://www.redotheweb.com/2015/11/09/api-security.html

+1

Problema: - Non è possibile utilizzare un carattere jolly "*" nell'intestazione "Access-Control-Allow-Origin" quando il flag delle credenziali è true. L'origine 'null' non è quindi consentita l'accesso. – ZiglioUK

+0

Francois, ho letto il tuo articolo, sto consumando una API che è un servizio web. Richiede l'autenticazione di sistema (non un db guidato). Uso con credenziali e in grado di accedere. Ora è possibile memorizzare queste credenziali in cookie e ignorare l'autenticazione. Grazie per l'articolo –

+0

È inoltre necessario impostare l'intestazione di risposta 'Access-Control-Allow-Credentials' su' 'true'', altrimenti il ​​browser bloccherà (negherà) la richiesta. – Tim

5

ho avuto un problema simile, e si è scoperto che le impostazioni del browser stavano bloccando i cookie di terze parti (Chrome> Impostazioni> Impostazioni avanzate> Privacy> Impostazioni contenuti> Blocco di terze parti cookie e dati del sito). Lo sblocco ha risolto il problema!

+2

Infatti. E poiché questa è l'impostazione predefinita in Safari, e possibile nella maggior parte degli altri browser, la creazione di un sito che si basa su cookie di terze parti tramite CORS dovrebbe essere presa in considerazione. Pochi utenti potrebbero voler dire di abilitare i cookie di terze parti affinché un sito funzioni. –

+0

Ho appena trascorso tre ore a risolvere problemi e cercare supporto prima di rendermi conto che questo era il mio problema. Grazie! – Chris

+11

Ho lo stesso problema, ma "Blocca cookie di terze parti e dati del sito" è già disabilitato. – Thayne

Problemi correlati