2015-12-04 11 views
11

Improvvisamente, apparentemente senza cambiare nulla nella mia web app, ho iniziato a ricevere CORS errori quando lo si apre in Chrome. Ho provato ad aggiungere un header Access-Control-Allow-Origin: *. Allora ottengo questo errore:Access-Control-Allow-Origin: "*" non sono ammessi quando le credenziali flag è vero, ma non c'è Access-Control-Allow-Credenziali intestazione

XMLHttpRequest cannot load http://localhost:9091/sockjs-node/info?t= 1449187563637. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:3010' is therefore not allowed access.

Ma come si può vedere nella figura seguente, non c'è Access-Control-Allow-Credentials intestazione.

enter image description here

WTF? Bug di Chrome?

La mia pagina viene caricata allo http://localhost:3010 e il server utilizza anche Access-Control-Allow-Origin: * senza problemi. C'è un problema se i due endpoint lo usano entrambi?

risposta

22

"indicatore di credenziali" si riferisce a XMLHttpRequest.withCredentials della richiesta effettuata, non a un'intestazione Access-Control-Allow-Credentials. Quella era la fonte della mia confusione.

Se del withCredentials richiesta è true, Access-Control-Allow-Origin: * non può essere usato, anche se non ci sono Access-Control-Allow-Credentials intestazione.

+1

Sì Quando si effettua una chiamata AJAX con il parametro conCredentials: true, l'intestazione della risposta deve avere Access-Control-Allow-Credentials = true. Di conseguenza, queste intestazioni non consentono l'utilizzo di Access-Control-Allow-Origin = * Per ulteriori informazioni, sul parametro withCredential e l'intestazione di risposta, consultare questo articolo: http://www.ozkary.com /2015/12/api-oauth-token-access-control-allow-credentials.html – ozkary

+1

Lo stesso qui, pensavo che il messaggio di errore si riferisse all'intestazione. Non ero a conoscenza del flag 'withCredentials'. Strano. – BastiBen

+0

Ho inoltrato un bug cromato sul fatto che il messaggio sia confuso e, se ricordo bene, l'hanno preso sul serio – Andy

2

ho risolto lo stesso problema utilizzando questi passaggi ..

1) disattivare il suo Chrome Extension "Consenti-Control-Allow-Origin"

2) aggiungere questi nella vostra servizio

var xhr = new(); xhr.withCredentials = true;

+1

"il servlet"? (Sono ancora new-ish per il web-end front-end, quindi non ho idea di cosa sia in questo contesto.) Grazie. –

+0

error.non "il servlet" ..è il vostro servizio –

+1

grazie, ha funzionato per me subito dopo aver disattivato l'estensione chrome "Allow-Control-Allow-Origin) – Mawardy

0

Richieste withCredentials:true, su un server configurato con Access-Control-Allow-Origin: *può essere utilizzato, ma avrete bisogno di un po 'di configurazione più extra sul tuo server:

Utilizzando Access-Control-Allow-Origin=* sul server, non permetterà l'accesso a qualsiasi risorsa (che richiede credenziali) su qualsiasi richiesta CORS di xhr.

Soluzioni alternative:

  1. fare quella risorsa remota sul server accessibile senza credenziali (e utilizzare xhr.withCredentials = false)
  2. Creare una regola di riscrittura sul il server, per modificare l'intestazione di risposta Access-Control-Allow-Origin=* a l'origine della richiesta. È possibile anche applicare questa riscrittura base a determinati criteri, ad esempio, se richiesta sta usando determinata porta o si tratta di una lista di whitelist domini.

Ecco alcune article that explains how to do this on a IIS server, ma si può fare questo in molti altri server:

PS: in caso di utilizzo delle credenziali, sarà necessario anche la seguente intestazione sulla risposta del server: Access-Control-Allow-Credentials=true

PS2: solo il valore 1 è permesso al paramenter "access-control-allow-origin". Se si tenta di utilizzare per esempio due domini: dominio1.com dominio2.com, non funzionerà.

Problemi correlati