web-dev-qa-db-fra.com

Access-Control-Allow-Origin: "*" non autorisé lorsque l'indicateur d'informations d'identification est vrai, mais il n'y a pas d'en-tête Access-Control-Allow-Credentials

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.

enter image description here

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?

15
Andy

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

23
Andy

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:

  1. Rendez cette ressource distante sur le serveur accessible sans informations d'identification (et utilisez xhr.withCredentials = false)
  2. Créez une règle de réécriture sur le serveur, pour modifier l'en-tête de réponse 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.

3
Alberto

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;

2
Jayani Sumudini