Habilitación de CORS para un recurso de la API de REST - Amazon API Gateway

Habilitación de CORS para un recurso de la API de REST

Intercambio de Recursos de Origen Cruzado (CORS) es una característica de seguridad del navegador que restringe las solicitudes HTTP de origen cruzado que se inician desde secuencias de comandos que se ejecutan en el navegador.

Determinar si se habilita la compatibilidad con CORS

Una solicitud HTTP de origen cruzado es una que se hace para:

  • Un dominio diferente (por ejemplo, de example.com a amazondomains.com)

  • Un subdominio diferente (por ejemplo, de example.com a petstore.example.com)

  • Un puerto diferente (por ejemplo, de example.com a example.com:10777)

  • Un protocolo diferente (por ejemplo, de https://example.com a http://example.com)

Si no puede acceder a la API y recibe un mensaje de error que contiene Cross-Origin Request Blocked, es posible que deba habilitar CORS.

Las solicitudes HTTP de origen cruzado se pueden dividir en dos tipos: solicitudes simples y solicitudes no simples.

Habilitar CORS para una solicitud sencilla

Una solicitud HTTP es simple si se cumplen todas las condiciones siguientes:

  • Se emite contra un recurso de API que permite únicamente solicitudes GET, HEAD y POST.

  • Si se trata de una solicitud de método POST, debe incluir un encabezado Origin.

  • El tipo de contenido de la carga de la solicitud es text/plain, multipart/form-data o application/x-www-form-urlencoded.

  • La solicitud no contiene encabezados personalizados.

  • Cualquier requisito adicional enumerado en la documentación de CORS de Mozilla para solicitudes simples.

Para solicitudes simples de método POST de origen cruzado, la respuesta del recurso debe incluir el encabezado Access-Control-Allow-Origin: '*' o Access-Control-Allow-Origin:'origin'.

Todas los demás solicitudes HTTP de origen cruzado son solicitudes no simples.

Habilitar CORS para una solicitud no sencilla

Si los recursos de su API reciben solicitudes no sencillas, deberá habilitar la compatibilidad con CORS adicional en función del tipo de integración.

Habilitar CORS para integraciones que no sean de proxy

Para estas integraciones, el protocolo CORS requiere que el navegador envíe una solicitud preliminar al servidor y espere la aprobación (o una solicitud de credenciales) desde el servidor antes de enviar la solicitud real. Debe configurar su API para enviar una respuesta adecuada a la solicitud de verificación previa.

Para crear una respuesta con comprobación previa:

  1. Cree un método OPTIONS con una integración simulada.

  2. Añada los siguientes encabezados de respuesta a la respuesta del método 200:

    • Access-Control-Allow-Headers

    • Access-Control-Allow-Methods

    • Access-Control-Allow-Origin

  3. Introduzca valores para los encabezados de las respuestas. Para permitir todos los orígenes, todos los métodos y los encabezados comunes, utilice los siguientes valores de encabezado:

    • 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: '*'

Tras crear la solicitud con comprobación previa, debe devolver el encabezado Access-Control-Allow-Origin: '*' o Access-Control-Allow-Origin:'origin' de todos los métodos habilitados para CORS para al menos las 200 respuestas.

Habilitar CORS para integraciones que no sean de proxy mediante AWS Management Console

Puede utilizar la AWS Management Console para habilitar CORS. API Gateway crea un método OPTIONS y agrega el encabezado Access-Control-Allow-Origin a las respuestas de integración de métodos existentes. Esto no siempre funciona y, a veces, es necesario modificar manualmente la respuesta de integración para que devuelva el encabezado Access-Control-Allow-Origin de todos los métodos compatibles con CORS de al menos las 200 respuestas.

Habilitar la compatibilidad con CORS para integraciones de proxy

En el caso de una integración de proxy Lambda o de proxy HTTP, el backend es responsable de devolver los encabezados Access-Control-Allow-Origin, Access-Control-Allow-Methods y Access-Control-Allow-Headers, ya que una integración de proxy no devuelve una respuesta de integración.

Las siguientes funciones de ejemplo de Lambda devuelven los encabezados CORS necesarios:

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