Como faço para configurar o CORS?

12

O Drupal 8 possui serviço web RESTful embutido no núcleo e, desde a versão 8.2, não precisamos do módulo cors .

Agora, para usar os serviços, apenas ativamos e configuramos o arquivo default.service.yml, conforme especificado aqui

No entanto, não foi possível definir esta configuração para permitir o acesso ao serviço da web em outro domínio.

Minha configuração atual service.yml para cors é:

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

Pesquisei no Google para encontrar configurações mais detalhadas sobre isso, mas não consegui encontrar uma.

Estou criando isso para o desenvolvimento de testes em dois domínios diferentes.

Usando o ambiente de desenvolvimento pantheon para serviços da Web e o domínio .dev personalizado de host local para consumir esses serviços.

Acesso ao serviço funcionando bem usando a extensão CORS do chrome.

sarathkm
fonte
Se você já alterou seu site / default / services.yml, como foi dito nas respostas anteriores, e Não funcionou, verifique se o CORS está ativado no seu servidor da web. Por exemplo, no Nginx, você precisa adicionar / modificar um local na configuração do bloco do servidor, consulte https://enable-cors.org/server_nginx.html
Pin

Respostas:

16

Eu me deparei com isso recentemente no Pantheon, e espero que isso ajude, se você ainda não o resolveu.

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

Algumas coisas a serem observadas ...

Em relação à localização do arquivo no Pantheon, verifique se o arquivo service.yml está em / sites / default vs just / sites. Eu estava errado com a impressão de que funcionaria nos dois lugares. Só funcionará se estiver no diretório / sites / default.

Observe a lista separada por vírgula de allowedHeaders, cada um em seu próprio conjunto de aspas. Originalmente, eu tinha uma única string como você no exemplo acima e ela falhou inúmeras vezes antes de perceber a diferença sutil. Tenho certeza de que o allowedMethods funciona da mesma maneira se você deseja listar especificamente seus métodos.

Observe também que, embora meu snippet de código funcione bem no desenvolvimento de uma sandbox Pantheon, você provavelmente desejará bloquear as coisas um pouco mais antes de entrar em produção. Com o Pantheon oferecendo HTTPS, você também precisará usá-lo para passar informações pelos cabeçalhos. Espero que isso ajude você, se você ainda está tendo problemas ou alguém que o encontrou na estrada.

Shawn Matthews
fonte
4
Por que especificar allowedOrigins e também passar '*'?
Christian
Simplesmente para mostrar as duas opções. Por favor, sinta-se livre para omitir um ou outro.
Shawn Matthews
exposedHeaders deve ser falsa ou um array, por drupal.org/project/drupal/issues/2905848
John
Se alguém estiver interessado, não acredito que o campo allowedOrigins aceite regex. Tentei usar um padrão regex para colocar vários subdomínios na lista de permissões e o drupal reclamou. Eu tive que usar uma lista explícita de domínios, separados por vírgula, como neste exemplo. Eu estava esperando que ele iria se comportar como os-hosts confiáveis pondo em settings.php
Tony Stecca
9

Encontre: ... / sites / default / default.services.yml

Faça uma cópia e renomeie a cópia para:

... / sites / default / services.yml

Encontre esta parte do código: cors.config: enabled: false

e substitua pelo seguinte - cors.config: enabled: true

Limpe o cache.

Soudip Paul
fonte
Eu deveria ter tentado de tudo até ver sua resposta, obrigado por mostrar o ponto mais importante que é LIMPAR O CACHE (CACHE RECONSTRUÍDO): D
emy
3

A seguinte configuração está funcionando para mim.

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
fonte
0

posedHeaders: true não é válido e causará Aviso: implode (): Argumentos inválidos transmitidos em Asm89 \ Stack \ CorsService-> addActualRequestHeaders () (linha 94 de / vendor / asm89 / stack-cors / src / Asm89 / Stack / CorsService. php) # 0 /web/core/includes/bootstrap.inc(584) Precisa ser falso ou um array com cabeçalhos permitidos para expor, consulte https://developer.mozilla.org/en-US/docs/Web/ HTTP / Headers / Access-Control-Expose-Headers

Jagermonster
fonte