2014-06-11 15 views
9

Ho impostato un semplice modulo di caricamento file utilizzando la chiamata ajax di jQuery verso un dominio diverso. Il browser ha un cookie per il dominio e questo cookie viene inviato con la richiesta in Firefox. Tuttavia, il cookie non è presente in Chrome, con conseguente errore di accesso. Ho verificato che il cookie esiste in Chrome, non è appena stato inviato con la richiesta.Cookie CORS non inviato in Chrome

Chiamata ajax: Alcune di queste potrebbero non essere necessarie. È stato aggiunto il tentativo di soluzioni correlate e lasciato a dimostrare tali tentativi.

<head> 
    <script src="jquery-2.1.1.min.js"></script> 
</head> 

<form enctype="multipart/form-data" id="file" method="POST"> 
    <input name="file" type="file" /> 
    <input name="Submit" type="button" id="upload"/> 
</form> 

<script type="text/javascript"> 
    $.support.cors = true 

    $('input#upload').click(function(){ 
     var formData = new FormData($('form#file')[0]); 

     .ajax({ 
      url: 'http://accounts.mysite.dev/file/saveasset', 
      type: 'POST', 
      data: formData, 
      cache: false, 
      contentType: false, 
      processData: false, 
      xhrFields: { 
       withCredentials: true 
      }, 
      crossDomain: true 
     }); 
    }); 
</script> 

Firefox invia le intestazioni corrette, tra cui cookie dell'utente

POST /file/saveasset HTTP/1.1 
Host: accounts.mysite.dev 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0 
Accept: */* 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
DNT: 1 
Referer: http://phptest/htmltest/fileUpload.html 
Content-Length: 8032 
Content-Type: multipart/form-data; boundary=---------------------------4450073521062221055385143281 
Origin: http://phptest 
Cookie: Accounts=somecookiestuff 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 

Ma Chrome non

POST /file/saveasset HTTP/1.1 
Host: accounts.mysite.dev 
Content-Length: 7981 
Accept: */* 
Origin: http://phptest 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryGyMYxvKgEKWfBR5x 
Referer: http://phptest/htmltest/fileUpload.html 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

Credo che il server è configurato correttamente per consentire questa origine e le credenziali , ma non vengono nemmeno inviati nella richiesta di Chrome. Nel caso in cui è rilevante, il mio server (php w/Zend) imposta

$this->_response->setHeader('Access-Control-Allow-Origin', 'http://phptest'); 
$this->_response->setHeader('Access-Control-Allow-Credentials', 'true'); 

non vedo alcuna OPZIONE richiesta di verifica preliminare sul server.

Perché Chrome non invia il mio cookie?

+0

Quali cookie ci si aspetta di vedere in Chrome impostato in FF? Entrambe le richieste hanno un'intestazione 'Origin'. – Palpatim

+0

L'intestazione del cookie. –

risposta

13

Verificare se Chrome è impostato per bloccare i cookie 3rd Party:

menu Impostazioni → → Mostra impostazioni avanzate ... → Privacy: impostazioni del contenuto

Assicurarsi che "Blocca cookie di terze parti e dati del sito" è incontrollato. Oppure, se hai qualcos'altro che blocca i cookie di terze parti disabilita anche questo.

Avendo lo stesso problema con richieste JSONP tra siti, i cookie non vengono inviati su richieste di tag tra domini.

+0

Fantastico! Non penso _ questa è l'impostazione predefinita, quindi devo averlo cambiato ad un certo punto. –

+0

Esiste un altro modo per farlo oltre a modificare le impostazioni? –

+0

Questo è solo uno dei nostri sviluppatori e ci è costato un po 'di tempo. Grazie per questo. – radicalmatt

Problemi correlati