CORS (Cross-Origin Resource Sharing) é uma política de segurança implementada pelos navegadores da web que permite que um servidor restrinja quais origens podem acessar seus recursos por meio de solicitações HTTP.
É recomendado o uso do CORS sempre que um aplicativo web precise fazer requisições HTTP para recursos em um domínio ou porta diferente do que o aplicativo está sendo hospedado. Isso ajuda a proteger o servidor contra ataques maliciosos que possam tentar acessar recursos indevidamente.
Como funciona?
Quando uma página da web faz uma requisição para um domínio diferente, o navegador enviará primeiro uma solicitação de "Preflight" para o servidor desse domínio que verificará se solicitação é permitida, o servidor responderá com um conjunto de cabeçalhos que indicam se a solicitação é permitida ou não, se a solicitação for permitida, então o navegador enviará a solicitação real.
Headers
Alguns dos cabeçalhos mais comuns usados no CORS incluem:
Access-Control-Allow-Origin: Especifica quais origens são permitidas a acessar o recurso. Pode ser um valor único (*), que permite que qualquer origem acesse o recurso, ou uma lista de domínios específicos.
Access-Control-Allow-Methods: Especifica quais métodos HTTP são permitidos na solicitação de recurso (por exemplo, GET, POST, DELETE, etc.).
Access-Control-Allow-Headers: Especifica quais cabeçalhos personalizados são permitidos na solicitação de recurso. É necessário especificar isso para que um cabeçalho personalizado como "Authorization" possa ser enviado com a solicitação.
Access-Control-Expose-Headers: Especifica quais cabeçalhos personalizados são expostos para a solicitação de recurso.
Access-Control-Allow-Credentials: Especifica se o recurso pode ser acessado com credenciais (por exemplo, cookies, cabeçalhos de autorização, etc.) pela solicitação de origem.
CORS na Digibee
Pode-se utilizar o CORS individualmente nos pipelines, ou pode ser configurado para todo o realm, através da Configuração Global de CORS.
Exemplos:
Autorizamos para o pipeline utilizando o trigger REST os métodos GET e OPTIONS. Ativamos o CORS e definimos os headers Access-Control-Allow-Origin para aceitar qualquer (*) origem, Access-Control-Allow-Methods para aceitar apenas o método GET e o Access-Control-Allow-Headers para aceitar requisições que possam conter apenas os headers Authorization, Content-Type e apikey.
Request com sucesso (autorizado pelo navegador)
Efetuamos um request pelo navegador Google Chrome, utilizando o método GET, e os headers Content-Type e apikey.
O navegador faz o "Preflight" para o endpoint da Digibee utilizando o método OPTIONS, que retorna os headers CORS, como o request atende a política CORS definida configurada no trigger do Pipeline, estamos autorizados a seguir com o GET request.
Agora seguimos com o fluxo normal do pipeline, que seria o request GET, que é retornado com sucesso.
Exemplo de request sem sucesso 1 (negado pelo navegador)
Fazemos o mesmo request, porém adicionando o Header "test" no nosso request.
Como o Header "test" não foi autorizado, a requisição foi bloqueada pela politica do CORS. E o GET Request não irá chegar na Digibee.
Exemplo de request sem sucesso 2 (negado pelo navegador)
Neste exemplo os headers estão de acordo com a política CORS, porém, o verbo utilizado pela chamada no navegador não está configurado no nosso trigger.
Isso gerará um erro 404 Not found