

# CORS para APIs REST no API Gateway
<a name="how-to-cors"></a>

O [compartilhamento de recursos entre origens (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/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. Consulte mais informações em [O que é CORS?](https://aws.amazon.com/what-is/cross-origin-resource-sharing/).

## Determinar se deseja habilitar o suporte ao CORS
<a name="apigateway-cors-request-types"></a>

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`)

 Se você não conseguir acessar sua API e receber uma mensagem de erro contendo `Cross-Origin Request Blocked`, talvez seja necessário habilitar o CORS.

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

## Habilitar o CORS para uma solicitação simples
<a name="apigateway-cors-simple-request"></a>

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](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests).

Para solicitações simples do método `POST` de origem cruzada, a resposta de seu recurso precisa incluir o cabeçalho `Access-Control-Allow-Origin: '*'` ou `Access-Control-Allow-Origin:{{'origin'}}`.

Todas as outras solicitações HTTP entre origens são solicitações *não simples*.

## Habilitar o CORS para uma solicitação não simples
<a name="apigateway-enable-cors-non-simple"></a>

Se os recursos de sua API receberem solicitações não simples, você deverá habilitar o suporte CORS adicional, dependendo de seu tipo de integração.

### Habilitar o CORS para integrações sem proxy
<a name="apigateway-enable-cors-mock"></a>

Para essas integrações, o [protocolo CORS](https://fetch.spec.whatwg.org/#http-cors-protocol) exige que o navegador envie uma solicitação de simulação ao servidor e aguarde a aprovação (ou uma solicitação de credenciais) do servidor antes de enviar a solicitação real. Você deve configurar sua API para enviar uma resposta apropriada à solicitação de simulação. 

 Como criar uma resposta de simulação: 

1. Crie um método `OPTIONS` com uma integração de simulação.

1. Adicione os seguintes cabeçalhos de resposta à resposta do método 200:
   + `Access-Control-Allow-Headers`
   + `Access-Control-Allow-Methods`
   + `Access-Control-Allow-Origin`

1. Defina o comportamento de passagem da integração como `NEVER`. Nesse caso, a solicitação de método de um tipo de conteúdo não mapeado será rejeitada com uma resposta HTTP 415 Tipo de mídia incompatível. Para obter mais informações, consulte [Comportamento de solicitação de método para cargas úteis sem modelos de mapeamento para APIs REST no API Gateway](integration-passthrough-behaviors.md).

1. Insira valores para os cabeçalhos de resposta. Para possibilitar todas as origens, todos os métodos e cabeçalhos comuns, use os seguintes valores de cabeçalho:
   + `Access-Control-Allow-Headers: 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'`
   + `Access-Control-Allow-Methods: 'DELETE,GET,HEAD,OPTIONS,PUT,POST,PATCH'`
   + `Access-Control-Allow-Origin: '*'`

Depois de criar a solicitação de simulação, você deve retornar o cabeçalho `Access-Control-Allow-Origin: '*'` ou `Access-Control-Allow-Origin:{{'origin'}}` para todos os métodos habilitados para CORS para pelo menos todas as 200 respostas.

### Habilitar o CORS para integrações sem proxy usando o Console de gerenciamento da AWS
<a name="apigateway-enable-cors-mock-console"></a>

Você pode usar o Console de gerenciamento da AWS para habilitar o CORS. O API Gateway cria um método `OPTIONS` e tenta adiciona o cabeçalho `Access-Control-Allow-Origin` às respostas de integração de métodos existentes. Isso nem sempre funciona e, às vezes, você precisa modificar manualmente a resposta de integração para retornar o cabeçalho `Access-Control-Allow-Origin` de todos os métodos habilitados para CORS para pelo menos todas as 200 respostas.

Se você tiver tipos de mídia binários definidos como `*/*` para a API, quando o API Gateway criar um método `OPTIONS`, altere `contentHandling` para `CONVERT_TO_TEXT`.

O comando [update-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-integration.html) abaixo altera `contentHandling` para `CONVERT_TO_TEXT` em uma solicitação de integração: 

```
aws apigateway update-integration \
  --rest-api-id {{abc123}} \
  --resource-id {{aaa111}} \
  --http-method OPTIONS \
  --patch-operations op='replace',path='/contentHandling',value='CONVERT_TO_TEXT'
```

O comando [update-integration-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-integration-response.html) abaixo altera `contentHandling` para `CONVERT_TO_TEXT` em uma resposta de integração:

```
aws apigateway update-integration-response \
  --rest-api-id {{abc123}} \
  --resource-id {{aaa111}} \
  --http-method OPTIONS \
  --status-code 200 \
  --patch-operations op='replace',path='/contentHandling',value='CONVERT_TO_TEXT'
```

## Habilitar o suporte ao CORS para integrações de proxy
<a name="apigateway-enable-cors-proxy"></a>

Para uma integração de proxy do Lambda ou integração de proxy HTTP, seu back-end é responsável por retornar os cabeçalhos `Access-Control-Allow-Origin`, `Access-Control-Allow-Methods` e `Access-Control-Allow-Headers`, porque 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 ]

```
export const 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!')
    }
```

------

**Topics**
+ [Determinar se deseja habilitar o suporte ao CORS](#apigateway-cors-request-types)
+ [Habilitar o CORS para uma solicitação simples](#apigateway-cors-simple-request)
+ [Habilitar o CORS para uma solicitação não simples](#apigateway-enable-cors-non-simple)
+ [Habilitar o suporte ao CORS para integrações de proxy](#apigateway-enable-cors-proxy)
+ [Ativar o CORS em um recurso usando o console do API Gateway](how-to-cors-console.md)
+ [Ativar o CORS em um recurso usando a API de importação do API Gateway](enable-cors-for-resource-using-swagger-importer-tool.md)
+ [Testar o CORS para uma API do API Gateway](apigateway-test-cors.md)