¿Cómo configuro CORS?

12

Drupal 8 tiene un servicio web RESTful incorporado en el núcleo y desde 8.2 no necesitamos el módulo cors .

Ahora para usar los servicios, solo habilitamos y configuramos el archivo default.service.yml como se especifica aquí

Sin embargo, no pude configurar esta configuración para permitir el acceso al servicio web en otro dominio.

Mi configuración actual de service.yml para cors es:

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

Busqué en Google para encontrar una configuración más detallada sobre esto, pero no pude encontrar una.

Estoy creando esto para el desarrollo de pruebas en dos dominios diferentes.

Uso del entorno de desarrollo de pantheon para servicios web y dominio .dev personalizado localhost para consumir esos servicios.

El acceso al servicio funciona bien con la extensión Chrome CORS.

sarathkm
fuente
Si ya ha cambiado su sitio / default / services.yml como se dijo en las respuestas anteriores, y no funcionó, asegúrese de que CORS esté habilitado en su servidor web. Por ejemplo, en Nginx debe agregar / modificar una ubicación en la configuración de bloqueo de su servidor, consulte https://enable-cors.org/server_nginx.html
Pin

Respuestas:

16

Me encontré con esto hace poco en Pantheon, y espero que esto ayude si aún no lo has resuelto.

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

Algunas cosas a tener en cuenta ...

En cuanto a la ubicación del archivo en Pantheon, asegúrese de que su archivo service.yml esté en / sites / default vs just / sites. Estaba equivocado bajo la impresión de que funcionaría desde ambos lugares. Solo funcionará si está en el directorio / sites / default.

Observe la lista de comas permitidas separadas por comas cada una en su propio conjunto de citas. Originalmente tenía una sola cadena como usted en su ejemplo anterior, y falló innumerables veces antes de que percibiera la sutil diferencia. Estoy bastante seguro de que allowMethods funciona de la misma manera si específicamente desea enumerar sus métodos.

Tenga en cuenta también que, si bien mi fragmento de código funcionará bien para el desarrollo en un entorno limitado de Pantheon, es probable que desee bloquear un poco más las cosas antes de entrar en producción. Con Pantheon ofreciendo HTTPS, también querrás asegurarte de usarlo si vas a pasar información a través de los encabezados. Espero que esto te ayude si aún tienes problemas o si alguien más se topó con ellos en el futuro.

Shawn Matthews
fuente
44
¿Por qué especificar allowOrigins y luego también pasar '*'?
Christian
Simplemente para mostrar ambas opciones. Por favor, siéntase libre de omitir uno u otro.
Shawn Matthews
expuestosLos lectores deben ser falsos o una matriz, según drupal.org/project/drupal/issues/2905848
John
Si alguien está interesado, no creo que el campo allowOrigins acepte expresiones regulares. Intenté usar un patrón regex para incluir en la lista blanca varios subdominios y drupal se quejó. Tuve que usar una lista explícita de dominios, separados por comas, como en este ejemplo. Esperaba que se comportara como la configuración de hosts de confianza en settings.php
Tony Stecca
9

Buscar: ... / sites / default / default.services.yml

Haga una copia y cambie el nombre de la copia a:

... / sites / default / services.yml

Encuentre esta parte del código: cors.config: enabled: false

y reemplace con lo siguiente - cors.config: enabled: true

Limpia el caché.

Soudip Paul
fuente
Supuse que lo intenté todo hasta que vi su respuesta, gracias por mostrar el punto más importante que es LIMPIAR LA CACHÉ (CACHÉ RECONSTRUIDO): D
emy
3

La siguiente configuración funciona para mí.

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
fuente