Aunque CORS se ha configurado a través de API Gateway y el Access-Control-Allow-Origin
encabezado está configurado, sigo recibiendo el siguiente error cuando intento llamar a la API desde AJAX dentro de Chrome:
XMLHttpRequest no puede cargar http://XXXXX.execute-api.us-west-2.amazonaws.com/beta/YYYYY . No hay un encabezado 'Access-Control-Allow-Origin' presente en el recurso solicitado. Por lo tanto, no se permite el acceso al origen 'nulo'. La respuesta tenía el código de estado HTTP 403.
Intenté OBTENER la URL a través de Postman y muestra que el encabezado anterior se pasó correctamente:
Y de la respuesta de OPCIONES:
¿Cómo puedo llamar a mi API desde el navegador sin volver a JSON-P?
Bucket Policy
? Asegúrese de tener el método en su pólizaRespuestas:
Tengo el mismo problema. He utilizado 10 horas para averiguarlo.
https://serverless.com/framework/docs/providers/aws/events/apigateway/
// handler.js 'use strict'; module.exports.hello = function(event, context, callback) { const response = { statusCode: 200, headers: { "Access-Control-Allow-Origin" : "*", // Required for CORS support to work "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS }, body: JSON.stringify({ "message": "Hello World!" }) }; callback(null, response); };
fuente
Si alguien más se encuentra con esto todavía, pude rastrear la causa raíz en mi aplicación.
Si está ejecutando API-Gateway con autorizadores personalizados, API-Gateway enviará un 401 o 403 antes de que llegue a su servidor. De forma predeterminada, API-Gateway NO está configurado para CORS cuando se devuelve 4xx desde un autorizador personalizado.
También - si quieres pasar a estar recibiendo un código de estado
0
o1
de una petición que corre a través de la API de puerta de enlace, esto es probablemente su problema.Para solucionarlo, en la configuración de API Gateway, vaya a "Respuestas de Gateway", expanda "Default 4XX" y agregue un encabezado de configuración CORS allí. es decir
Access-Control-Allow-Origin: '*'
Asegúrese de volver a implementar su puerta de enlace , ¡y listo!
fuente
aws apigateway update-gateway-response --rest-api-id "XXXXXXXXX" --response-type "DEFAULT_4XX" --patch-operations op="add",path="/responseParameters/gatewayresponse.header.Access-Control-Allow-Origin",value='"'"'*'"'"'
1) Necesitaba hacer lo mismo que @riseres y algunos otros cambios. Estos son mis encabezados de respuesta:
headers: { 'Access-Control-Allow-Origin' : '*', 'Access-Control-Allow-Headers':'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token', 'Access-Control-Allow-Credentials' : true, 'Content-Type': 'application/json' }
2) Y
Según esta documentación:
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
Cuando usa proxy para funciones lambda en la configuración de API Gateway, los métodos post u get no tienen encabezados agregados, solo las opciones. Debe hacerlo manualmente en la respuesta (servidor o respuesta lambda).
3) Y
Además de eso, necesitaba deshabilitar la opción 'Se requiere clave API' en mi método de publicación de puerta de enlace API.
fuente
Si ha intentado todo lo relacionado con este tema sin éxito, terminará donde lo hice. Resulta que las instrucciones de configuración de CORS existentes de Amazon funcionan bien ... ¡solo asegúrese de recordar volver a implementar ! El asistente de edición CORS, incluso con todas sus pequeñas y agradables marcas de verificación verdes, no realiza actualizaciones en vivo de su API. Quizás obvio, pero me dejó perplejo durante medio día.
fuente
Conseguí que mi ejemplo funcionara: acabo de insertar 'Access-Control-Allow-Origin': '*', dentro de los encabezados: {} en la función Lambda de nodejs generada. Hice no hay cambios en la capa API generada-Lambda.
Aquí está mi NodeJS:
'use strict'; const doc = require('dynamodb-doc'); const dynamo = new doc.DynamoDB(); exports.handler = ( event, context, callback ) => { const done = ( err, res ) => callback( null, { statusCode: err ? '400' : '200', body: err ? err.message : JSON.stringify(res), headers:{ 'Access-Control-Allow-Origin' : '*' }, }); switch( event.httpMethod ) { ... } };
Aquí está mi llamada AJAX
$.ajax({ url: 'https://x.execute-api.x-x-x.amazonaws.com/prod/fnXx?TableName=x', type: 'GET', beforeSend: function(){ $( '#loader' ).show();}, success: function( res ) { alert( JSON.stringify(res) ); }, error:function(e){ alert('Lambda returned error\n\n' + e.responseText); }, complete:function(){ $('#loader').hide(); } });
fuente
Para los empleados de Google:
He aquí por qué:
GET
/POST
sin cookies no activa la verificación previaOPTIONS
método para esa ruta, luego enviaráAllow-Origin
encabezados usando respuestas simuladas cuando el usuario llameOPTIONS
, peroGET
/POST
no obtendráAllow-Origin
automáticamenteAllow-Origin
encabezadoOPTIONS
Para resumirlo:
OPTIONS
API Gateway solo generará inofensivoOPTIONS
solo se utilizan por el navegador como medida de precaución para comprobar la posibilidad de CORS en una rutaGET
. Ej .POST
fuente
Acabo de agregar encabezados a la respuesta de mi función lambda y funcionó como un encanto
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hey it works'), headers:{ 'Access-Control-Allow-Origin' : '*' } }; return response; };
fuente
Encontré una solución simple dentro
API Gateway> Seleccione su punto final de API> Seleccione el método (en mi caso fue el POST)
Ahora hay un menú desplegable ACCIONES> Habilitar CORS ... selecciónelo.
Ahora seleccione el menú desplegable ACCIONES nuevamente> Implementar API (volver a implementarlo)
Funcionó !
fuente
Hice que el mío funcionara después de darme cuenta de que el autorizador lambda estaba fallando y, por alguna razón desconocida, se estaba traduciendo en un error CORS. Una solución simple a mi autorizador (y algunas pruebas de autorizador que debería haber agregado en primer lugar) y funcionó. Para mí, la acción de API Gateway 'Habilitar CORS' era necesaria. Esto agregó todos los encabezados y otras configuraciones que necesitaba en mi API.
fuente
Para mí, la respuesta que FINALMENTE FUNCIONÓ, fue el comentario de James Shapiro de la respuesta de Alex R (el segundo más votado). Me metí en este problema de API Gateway en primer lugar, al intentar obtener una página web estática alojada en S3 para usar lambda para procesar la página de contacto y enviar un correo electrónico. Simplemente marcando [] Default 4XX solucionó el mensaje de error.
fuente
Después de cambiar su función o código, siga estos dos pasos.
Primero habilite CORS y luego implemente API cada vez.
fuente
Implementar el código después de habilitar CORS para ambos
POST
yOPTIONS
funcionó para mí.fuente
Estoy corriendo
aws-serverless-express
, y en mi caso necesitaba editarsimple-proxy-api.yaml
.Antes de que se configurara CORS
https://example.com
, simplemente cambié el nombre de mi sitio y lo volví a implementar a través denpm run setup
, y actualicé mi lambda / pila existente.#... /: #... method.response.header.Access-Control-Allow-Origin: "'https://example.com'" #... /{proxy+}: method.response.header.Access-Control-Allow-Origin: "'https://example.com'" #...
fuente
En mi caso, dado que estaba usando AWS_IAM como el método de autorización para API Gateway, necesitaba otorgar mis permisos de rol de IAM para llegar al punto final.
fuente
Otra causa raíz de este problema podría ser una diferencia entre HTTP / 1.1 y HTTP / 2.
Síntoma: algunos usuarios, no todos, informaron que obtenían un error CORS al usar nuestro software.
Problema: La
Access-Control-Allow-Origin
cabecera faltaba veces .Contexto: teníamos una Lambda en su lugar, dedicada a manejar
OPTIONS
solicitudes y responder con los encabezados CORS correspondientes, como hacerAccess-Control-Allow-Origin
coincidir una lista blancaOrigin
.Solución: API Gateway parece transformar todos los encabezados a minúsculas para las llamadas HTTP / 2, pero mantiene las mayúsculas para HTTP / 1.1. Esto provocó
event.headers.origin
que fallara el acceso a .Compruebe si también tiene este problema:
Suponiendo que su API está ubicada en
https://api.example.com
, y su interfaz está enhttps://www.example.com
. Usando CURL, haga una solicitud usando HTTP / 2:curl -v -X OPTIONS -H 'Origin: https://www.example.com' https://api.example.com
La salida de respuesta debe incluir el encabezado:
< Access-Control-Allow-Origin: https://www.example.com
Repita el mismo paso usando HTTP / 1.1 (o con un
Origin
encabezado en minúsculas ):curl -v -X OPTIONS --http1.1 -H 'Origin: https://www.example.com' https://api.example.com
Si
Access-Control-Allow-Origin
falta el encabezado, es posible que desee verificar la distinción entre mayúsculas y minúsculas al leer elOrigin
encabezado.fuente
Además de otros comentarios, algo a tener en cuenta es el estado devuelto por su integración subyacente y si se devuelve el encabezado Access-Control-Allow-Origin para ese estado.
Hacer lo 'Habilitar CORS' solo configura el estado 200. Si tiene otros en el punto final, por ejemplo, 4xx y 5xx, debe agregar el encabezado usted mismo.
fuente
En mi caso, simplemente estaba escribiendo mal la URL de la solicitud de recuperación. Activado
serverless.yml
, lo configuracors
entrue
:register-downloadable-client: handler: fetch-downloadable-client-data/register.register events: - http: path: register-downloadable-client method: post integration: lambda cors: true stage: ${self:custom.stage}
y luego, en el controlador lambda, envía los encabezados, pero si realiza la solicitud de recuperación incorrecta en la interfaz, no obtendrá ese encabezado en la respuesta y obtendrá este error. Por lo tanto, vuelva a verificar la URL de su solicitud en el frente.
fuente
En Python puede hacerlo como en el siguiente código:
{ "statusCode" : 200, 'headers': {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': "*" }, "body": json.dumps( { "temperature" : tempArray, "time": timeArray }) }
fuente