O compartilhamento de recursos entre origens (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
paraamazondomains.com
) -
Um subdomínio diferente (por exemplo, de
example.com
parapetstore.example.com
) -
Uma porta diferente (por exemplo, de
example.com
paraexample.com:10777
) -
Um protocolo diferente (por exemplo, de
https://example.com
parahttp://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
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
POST
,GET
eHEAD
. -
Se for uma solicitação de método
POST
, deverá incluir um cabeçalhoOrigin
. -
O tipo de conteúdo da carga da solicitação é
text/plain
,multipart/form-data
ouapplication/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 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
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
Para essas integrações, o protocolo CORS
Como criar uma resposta de simulação:
Crie um método
OPTIONS
com uma integração de simulação.-
Adicione os seguintes cabeçalhos de resposta à resposta do método 200:
-
Access-Control-Allow-Headers
-
Access-Control-Allow-Methods
-
Access-Control-Allow-Origin
-
-
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 ter mais informações, consulte Comportamentos de passagem direta de integração. -
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: '*'
-
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:
para todos os métodos habilitados para CORS para pelo menos todas as 200 respostas.'origin'
Habilitar o CORS para integrações sem proxy usando o AWS Management Console
Você pode usar o AWS Management Console 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.
Habilitar o suporte ao CORS para integrações de proxy
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:
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;
};