Comment configurer CORS?

12

Drupal 8 possède un service Web RESTful intégré au noyau et depuis la version 8.2, nous n'avons pas besoin de module cors .

Maintenant, pour utiliser les services, nous activons et configurons simplement le fichier default.service.yml comme spécifié ici

Cependant, je n'ai pas pu configurer cette configuration pour autoriser l'accès au service Web sur un autre domaine.

Ma configuration actuelle de service.yml pour les cors est la suivante:

cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    allowedHeaders: ['x-csrf-token,authorization,content-type,accept,origin,x-requested-with']
    # Specify allowed request methods, specify ['*'] to allow all possible ones.
    allowedMethods: ['POST, GET, OPTIONS, DELETE, PUT']
    # Configure requests allowed from specific origins.
    allowedOrigins: ['*']
    # Sets the Access-Control-Expose-Headers header.
    exposedHeaders: false
    # Sets the Access-Control-Max-Age header.
    maxAge: 1000
    # Sets the Access-Control-Allow-Credentials header.
    supportsCredentials: false

J'ai googlé pour trouver une configuration plus détaillée à ce sujet, mais je n'ai pas pu en trouver une.

Je crée cela pour le développement de tests dans deux domaines différents.

Utilisation de l'environnement de développement Pantheon pour les services Web et du domaine .dev localhost personnalisé pour la consommation de ces services.

L'accès au service fonctionne correctement à l'aide de l'extension chrome CORS.

Sarathkm
la source
Si vous avez déjà modifié votre site / default / services.yml comme indiqué dans les réponses précédentes, et que cela n'a pas fonctionné, assurez-vous que CORS est activé sur votre serveur Web. Par exemple, dans Nginx, vous devez ajouter / modifier un emplacement dans la configuration de votre bloc serveur, voir https://enable-cors.org/server_nginx.html
Pin

Réponses:

16

J'ai rencontré cela assez récemment sur Pantheon, et j'espère que cela aide si vous ne l'avez pas déjà résolu.

cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with', 'access-control-allow-origin','x-allowed-header','*']
    # Specify allowed request methods, specify ['*'] to allow all possible ones.
    allowedMethods: ['*']
    # Configure requests allowed from specific origins.
    allowedOrigins: ['http://localhost/','http://localhost:3000','http://localhost:3001','http://localhost:3002','*']
    # Sets the Access-Control-Expose-Headers header.
    exposedHeaders: false
    # Sets the Access-Control-Max-Age header.
    maxAge: false
    # Sets the Access-Control-Allow-Credentials header.
    supportsCredentials: true

Quelques points à noter ...

En ce qui concerne l'emplacement du fichier sur Pantheon, assurez-vous que votre fichier service.yml se trouve dans / sites / default vs just / sites. J'avais à tort l'impression que cela fonctionnerait des deux côtés. Cela ne fonctionnera que si dans le répertoire / sites / default.

Remarquez la liste séparée par des virgules de allowedHeaders chacun dans leur propre ensemble de guillemets. À l'origine, j'avais une seule chaîne comme vous le faites dans votre exemple ci-dessus, et elle a échoué un nombre incalculable de fois avant de saisir la différence subtile. Je suis à peu près certain que allowMethods fonctionne de la même manière si vous souhaitez spécifiquement répertorier vos méthodes.

Veuillez également noter que même si mon extrait de code fonctionnera bien pour le développement contre un bac à sable Pantheon, vous voudrez probablement verrouiller les choses un peu plus avant de commencer la production. Avec Pantheon offrant HTTPS, vous voudrez également vous assurer de l'utiliser si vous allez transmettre des informations via des en-têtes. J'espère que cela vous aidera si vous rencontrez toujours des problèmes ou quelqu'un d'autre qui est tombé dessus en cours de route.

Shawn Matthews
la source
4
Pourquoi spécifier allowedOrigins et ensuite aussi passer '*'?
Christian
Simplement pour montrer les deux options. N'hésitez pas à omettre l'un ou l'autre.
Shawn Matthews
exposésLes en-têtes doivent être faux ou un tableau, par drupal.org/project/drupal/issues/2905848
John
Si quelqu'un est intéressé, je ne pense pas que le champ allowedOrigins accepte l'expression régulière. J'ai essayé d'utiliser un modèle d'expression régulière pour mettre en liste blanche plusieurs sous-domaines, et Drupal s'est plaint. J'ai dû utiliser une liste explicite de domaines, séparés par des virgules, comme dans cet exemple. J'espérais qu'il se comporterait comme le paramètre d'hôtes de confiance dans settings.php
Tony Stecca
9

Rechercher: ... / sites / default / default.services.yml

Faites une copie et renommez-la en:

... / sites / default / services.yml

Trouvez cette partie du code: cors.config: enabled: false

et remplacez par ce qui suit - cors.config: enabled: true

Videz le cache.

Soudip Paul
la source
J'ai supposé avoir tout essayé jusqu'à ce que vous voyiez votre réponse, merci d'avoir montré le point le plus important qui est EFFACER LA CACHE (RECONSTRUIRE LA CACHE): D
emy
3

Le paramètre suivant fonctionne pour moi.

cors.config:
  enabled: true
  # Specify allowed headers, like 'x-allowed-header'.
  allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with']
  # Specify allowed request methods, specify ['*'] to allow all possible ones.
  allowedMethods: ['*']
  # Configure requests allowed from specific origins.
  allowedOrigins: ['*']
  # Sets the Access-Control-Expose-Headers header.
  exposedHeaders: false
  # Sets the Access-Control-Max-Age header.
  maxAge: false
  # Sets the Access-Control-Allow-Credentials header.
  supportsCredentials: false
Aditya Joshi
la source
0

exposeHeaders: true n'est pas valide et provoquera Avertissement: implode (): Arguments non valides passés dans Asm89 \ Stack \ CorsService-> addActualRequestHeaders () (ligne 94 de / vendor / asm89 / stack-cors / src / Asm89 / Stack / CorsService. php) # 0 /web/core/includes/bootstrap.inc(584) Il doit être faux ou un tableau avec des en-têtes autorisés à exposer voir https://developer.mozilla.org/en-US/docs/Web/ HTTP / En-têtes / Access-Control-Expose-Headers

Jagermonster
la source