Habilitar o CORS para um recurso da API REST - Amazon API Gateway

Habilitar o CORS para um recurso da API REST

O compartilhamento de recursos entre origens (CORS) é um recurso de segurança de navegador que restringe as solicitações HTTP entre origens que são iniciadas em scripts em execução no navegador. Se os recursos da API REST receberem solicitações HTTP não simples de origem cruzada, será necessário ativar o suporte ao CORS.

Determinar se deseja habilitar o suporte ao CORS

Uma solicitação HTTP entre origens é uma solicitação que é feita para:

  • Um domínio diferente (por exemplo, de example.com para amazondomains.com)

  • Um subdomínio diferente (por exemplo, de example.com para petstore.example.com)

  • Uma porta diferente (por exemplo, de example.com para example.com:10777)

  • Um protocolo diferente (por exemplo, de https://example.com para http://example.com)

As solicitações HTTP entre origens podem ser divididas em dois tipos: solicitações simples e solicitações não simples.

Uma solicitação HTTP será simples se todas as condições a seguir forem verdadeiras:

  • Ela é emitida em relação a um recurso de API que permite apenas solicitações GET, HEAD e POST.

  • Se for uma solicitação de método POST, deverá incluir um cabeçalho Origin.

  • O tipo de conteúdo da carga da solicitação é text/plain, multipart/form-data ou application/x-www-form-urlencoded.

  • A solicitação não contém cabeçalhos personalizados.

  • Quaisquer requisitos adicionais que estão listados na Documentação do Mozilla CORS para solicitações simples.

Para solicitações de método POST simples entre origens, a resposta do seu recurso precisa incluir o cabeçalho Access-Control-Allow-Origin, onde o valor da chave de cabeçalho é definido como '*'(qualquer origem) ou é definido como as origens com permissão para acessar esse recurso.

Todas as outras solicitações HTTP entre origens são solicitações não simples. Se os recursos da API receberem solicitações não simples, será necessário habilitar o suporte ao CORS.

O que significa habilitar o suporte ao CORS

Quando um navegador recebe uma solicitação HTTP simples, o protocolo CORS exige que o navegador envie uma solicitação de simulação para o servidor e aguarde a aprovação (ou uma solicitação de credenciais) do servidor antes de enviar a solicitação real. A solicitação de simulação é exibida para sua API como uma solicitação HTTP que:

  • Inclui um cabeçalho Origin.

  • Usa o método OPTIONS.

  • Inclui os seguintes cabeçalhos:

    • Access-Control-Request-Method

    • Access-Control-Request-Headers

Para oferecer suporte ao CORS, portanto, um recurso de API REST precisa implementar um método OPTIONS que possa responder à solicitação de simulação OPTIONS com pelo menos os seguintes cabeçalhos de resposta exigidos pela Busca padrão:

  • Access-Control-Allow-Methods

  • Access-Control-Allow-Headers

  • Access-Control-Allow-Origin

A forma como você habilita o suporte ao CORS depende do tipo de integração da sua API.

Habilitar o suporte ao CORS para integrações simuladas

Para uma integração simulada, ative o CORS criando um método OPTIONS para retornar os cabeçalhos de resposta necessários (com valores estáticos adequados) como cabeçalhos de resposta de método. Além disso, cada um dos métodos reais habilitados para CORS também devem retornar o cabeçalho Access-Control-Allow-Origin:'request-originating server addresses' pelo menos em suas respostas 200, em que o valor da chave de cabeçalho é definido como '*' (qualquer origem) ou definido como as origens com permissão para acessar o recurso.

Habilitar o suporte ao CORS para integrações não proxy HTTP ou do Lambda e integrações de serviços da AWS

Para obter uma integração personalizada (não proxy) do Lambda, integração personalizada (não proxy) HTTP ou integração de serviço da AWS, é possível configurar os cabeçalhos necessários usando a resposta de método do API Gateway e as configurações de resposta de integração. Quando você habilita o CORS usando o AWS Management Console, o API Gateway cria um método OPTIONS e tenta adicionar o cabeçalho Access-Control-Allow-Origin às respostas de integração de métodos existentes. Isso não funciona sempre e, às vezes, é necessário modificar manualmente a resposta de integração para habilitar o CORS corretamente. Normalmente, isso apenas significa modificar manualmente a resposta de integração para retornar o cabeçalho Access-Control-Allow-Origin.

Habilitar o suporte ao CORS para integrações de proxy HTTP ou do Lambda

Para uma integração de proxy do Lambda ou integração de proxy HTTP, você ainda pode configurar os cabeçalhos de resposta OPTIONS necessários no API Gateway. No entanto, seu backend é responsável por retornar os cabeçalhos Access-Control-Allow-Origin e Access-Control-Allow-Headers, pois uma integração de proxy não retorna uma resposta de integração.

As seguintes funções de exemplo do Lambda retornam os cabeçalhos de CORS necessários:

Node.js
exports.handler = async (event) => { const response = { statusCode: 200, headers: { "Access-Control-Allow-Headers" : "Content-Type", "Access-Control-Allow-Origin": "https://www.example.com", "Access-Control-Allow-Methods": "OPTIONS,POST,GET" }, body: JSON.stringify('Hello from Lambda!'), }; return response; };
Python 3
import json def lambda_handler(event, context): return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Origin': 'https://www.example.com', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' }, 'body': json.dumps('Hello from Lambda!') }