Supponiamo di controllare due domini, www.api_domain.com
e www.website_domain.com
. www.api_domain.com
offre un'API che richiede all'utente di autenticarsi e quindi utilizza un cookie di sessione per riconoscere l'utente che sta effettuando richieste. www.website_domain.com
carica uno script nelle sue pagine da www.api_domain.com
e tale script desidera effettuare chiamate agli URL dell'API su www.api_domain.com
con il cookie dell'utente corrente e utilizzare i risultati in qualche modo nella pagina da www.website_domain.com
.Cookie interdominio in IE 8 e 9 senza iframe?
Per inizialmente caricamento dello script, o per le URL API che non richiedono cookie di sessione dell'utente al lavoro, la soluzione più semplice è semplicemente quello di utilizzare un'intestazione
Access-Control-Allow-Origin: http://www.website_domain.com
sulla risposta da www.api_domain.com
. Questo sembra funzionare fuori dalla scatola su tutti i browser oltre a IE, e sebbene IE non rispetti l'intestazione Allow-Origin sulle richieste AJAX fatte usando i metodi AJAX di jQuery, ci sono librerie come xdr.js che fanno un po 'di magia dietro le quinte per make jQuery, IE e l'intestazione Allow-Origin funzionano bene insieme e si comportano come in tutti gli altri browser (non conosco i dettagli di cosa fa xdr.js, ma funziona perfettamente per le richieste non credenziali, per quanto posso vedere).
Il problema si presenta quando voglio colpire un URL su http://www.api_domain.com
che richiede il cookie di sessione dell'utente. Quando questo problema è discusso in un ambiente browser agnostico, di solito sono proposte due soluzioni:
- Usa
Access-Control-Allow-Credentials: true
sulla risposta da fare i biscotti essere inviati anche con le richieste cross-domain. - Creare un iframe sulla pagina su
http://www.website_domain.com
di originehttp://www.api_domain.com
, avere le due finestre comunicano tra loro utilizzando HTML5 post messages e delegare tutto responsabilità di richieste dihttp://www.api_domain.com
al l'iframe.
sarei molto preferisce utilizzare l'opzione 1, se possibile, dal momento che consente di scrivere il codice Javascript per utilizzare l'API sul http://www.api_domain.com
nello stesso modo in cui si scrive a toccare un'API dello stesso dominio. Per utilizzare l'approccio iframe, avremmo bisogno di imparare o creare un framework per inviare richieste di tipo AJAX all'iframe, con successo e gestori di errori. Significa anche che abbiamo bisogno di creare il codice da caricare nell'iframe, che sarà solo un intero gruppo di involucri sottili per colpire gli URL dell'API. Sembra solo più brutto, complicato e più difficile da capire rispetto al primo approccio.
Tuttavia, non riesco a capire come far funzionare l'opzione 1 su IE. Sto impostando Access-Control-Allow-Credentials: true
sui miei URL API e tutti gli altri browser inviano cookie a tali URL, ma IE 9 non lo fa, anche con la libreria xdr.js. (Non ho testato su IE 8.) Non ci sono altri sintomi da segnalare. Posso vedere le intestazioni corrette Access-Control-Allow-Origin
e Access-Control-Allow-Credentials
nelle risposte da www.api_domain.com
quando le visualizzo negli strumenti di sviluppo di IE, ma non ci sono intestazioni di cookie nella richiesta.
C'è qualche incantesimo o incantesimo magico che posso utilizzare per fare in modo che Internet Explorer rispetti l'intestazione Access-Control-Allow-Credentials
o qualche altra intestazione che posso utilizzare riconosciuta da IE?
L'impostazione della politica sulla privacy di p3p è d'aiuto? http://stackoverflow.com/questions/2666376/copying-cookies-cross-domain-why-is-ie-blocking-cookies-other-browsers-are-send?rq=1 – flup
@flup No, è del tutto irrilevante Questo. –
Come una parte che non aiuta a rispondere a questa domanda ma è probabile che sia utile a chiunque la legga: piuttosto che creare il proprio iframe proxy, considerando l'utilizzo di [questa libreria] (https://github.com/jpillora/xdomain/) . Non l'ho provato, ma sembra che dovrebbe fare in modo trasparente tutto il lavoro di proxy del traffico AJAX tra domini tramite messaggio postale per voi. A meno che non sia inoltre necessario il supporto di supercookie per gestire il numero crescente di browser che bloccano i cookie di "terze parti" per impostazione predefinita (compresi quelli impostati negli iframe), dovrebbe essere adeguato. –