Du coup, apparemment sans rien changer dans mon application web, j'ai commencé à avoir des erreurs CORS en l'ouvrant dans Chrome. J'ai essayé d'ajouter un Access-Control-Allow-Origin: *
entête. Ensuite, je reçois cette erreur:
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.
Mais comme vous pouvez le voir dans l'image suivante, il n'y a pas de Access-Control-Allow-Credentials
entête.
WTF? Chrome bug?
Ma page est chargée à http://localhost:3010
et ce serveur utilise également Access-Control-Allow-Origin: *
sans problème. Existe-t-il un problème si les deux points de terminaison l'utilisent tous les deux?
"indicateur d'identification" fait référence à XMLHttpRequest.withCredentials
de la demande en cours, pas à un Access-Control-Allow-Credentials
header. Ce fut la source de ma confusion.
Si le withCredentials
de la requête est true
, Access-Control-Allow-Origin: *
ne peut pas être utilisé, même s'il n'y a pas de Access-Control-Allow-Credentials
entête.
Demandes withCredentials:true
, sur un serveur configuré avec Access-Control-Allow-Origin: *
PEUT être utilisé , mais vous aurez besoin d'une configuration supplémentaire sur votre serveur:
En utilisant Access-Control-Allow-Origin=*
sur le serveur, il n'autorisera l'accès à aucune ressource (qui nécessite des informations d'identification) sur toute demande CORS xhr.
Solutions de contournement:
xhr.withCredentials = false
)Access-Control-Allow-Origin=*
à l'origine de la demande. Vous pouvez également appliquer cette réécriture selon certains critères, par exemple, si la demande utilise un certain port ou si elle provient d'une liste de domaines en liste blanche.Voici quelques article qui explique comment procéder sur un IIS , mais vous pouvez le faire sur de nombreux autres serveurs:
PS: en cas d'utilisation des informations d'identification, vous aurez également besoin de l'en-tête suivant sur la réponse de votre serveur: Access-Control-Allow-Credentials=true
PS2: seule 1 valeur est autorisée pour le paramètre "access-control-allow-Origin". Si vous essayez d'utiliser par exemple deux domaines: domain1.com domain2.com, cela ne fonctionnera pas.
J'ai résolu le même problème en utilisant ces étapes ..
1) désactivez votre chrome extension "Allow-Control-Allow-Origin"
2) Ajoutez-les à votre service
var xhr = new (); xhr.withCredentials = true;