que from ejemplo custom aws authorizer apigateway amazon-web-services aws-lambda aws-api-gateway

amazon web services - from - ¿Cómo acceder a los encabezados HTTP para solicitar a AWS API Gateway usando Lambda?



que es api gateway (5)

Veo en las Preguntas frecuentes de API Gateway que es posible acceder a los encabezados de solicitud enviados a la API Gateway ...

Si ya utiliza tokens OAuth o cualquier otro mecanismo de autorización, puede configurar fácilmente API Gateway para no requerir llamadas API firmadas y simplemente reenviar los encabezados de tokens a su back-end para su verificación.

Sin embargo, no puedo encontrar ningún ejemplo de cómo hacerlo en la documentación y no está claro cómo acceder a estos datos usando Lambda.

Puedo configurar una API abierta y obtener acceso al objeto JSON que es parte de una POST ( Tutorial: Pasarela API y Funciones Lambda ), pero para implementar una API de estilo OAuth 2.0 con mi propio proveedor, necesito acceso a el encabezado "Autorización".

Mi preferencia es configurar esto usando Lambda y Java 8, pero un ejemplo usando node.js también sería útil para entender cómo lograr esto.


En primer lugar, debe atrapar el encabezado Authorization de la solicitud HTTP GET. Luego necesita asignar ese valor al objeto de evento Lambda.

Vaya al panel de métodos API y haga clic en Solicitud de método. Allí puede agregar un HTTP Request Header denominado Authorization como se muestra a continuación.

Esto atrapará el encabezado Authorization para que pueda usarlo más tarde.

Ahora regrese al panel de métodos y haga clic en Integration Request . Desde aquí puede pasar el valor del encabezado en la función Lambda usando un mapeo como este.

{ "Authorization": "$input.params(''Authorization'')" }

Ahora en su función Lambda puede obtener el valor así.

event.Authorization


Puede usar la siguiente Plantilla de mapeo en la Solicitud de integración para mapear genéricamente todos los parámetros de ruta, consulta y encabezado en el evento Lambda. Aún deberá registrarlos en la sección Solicitud de método de la puerta de enlace API, pero al menos puede desacoplar la plantilla de asignación de los parámetros específicos que desea utilizar. De esta forma, no tiene que cambiar el código de la Plantilla de asignación cada vez que cambie los encabezados, las consultas o los parámetros de la ruta.

Escribí una publicación de blog que proporciona más detalles y explicaciones sobre la plantilla de asignación: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

Aquí está la plantilla de mapeo que puede usar:

{ "method": "$context.httpMethod", "body" : $input.json(''$''), "headers": { #foreach($param in $input.params().header.keySet()) "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end #end }, "queryParams": { #foreach($param in $input.params().querystring.keySet()) "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end #end }, "pathParams": { #foreach($param in $input.params().path.keySet()) "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end #end } }


Según la respuesta de Prabhat, configurar la solicitud de integración del proxy lambda es la forma más sencilla de hacerlo, después de lo cual puede acceder a los encabezados de solicitud, parámetros de ruta y parámetros de consulta a través de

event[''pathParameters''][''param1''] event["queryStringParameters"][''queryparam1''] event[''requestContext''][''identity''][''userAgent''] event[''requestContext''][''identity''][''sourceIP'']


aunque este es un hilo viejo, he encontrado que es mejor utilizar la integración de proxy lambda para este propósito. Con esto no tienes que configurar nada en la puerta de enlace API y obtienes todos los encabezados en tu función lambda ...


Debe crear una asignación de entrada dentro del panel de Integration Request en la pantalla del panel que describa su método API.

El siguiente código traduce el parámetro de entrada de consulta de name al Lambda Event input object :

{ "name": "$input.params(''name'')" }

Captura de pantalla:

Puede encontrar más información sobre esto en la API Gateway original a la secuencia de entrada de Lambda en AWS Forums .