如何使用Lambda访问AWS API网关请求的HTTP标头?

Jar*_*eld 43 amazon-web-services aws-lambda aws-api-gateway

我在API网关常见问题解答中看到,可以访问发送到API网关的请求标头...

如果您已经使用OAuth令牌或任何其他授权机制,则可以轻松设置API网关,以便不需要签名的API调用,只需将令牌标头转发到后端进行验证即可.

但是,我在文档中找不到如何执行此操作的示例,并且不清楚如何使用Lambda访问此数据.

我能够设置一个开放的API并获得对作为POST一部分的JSON对象的访问权限(演练:API网关和Lambda函数),但为了使用我自己的提供程序实现OAuth 2.0样式API,我需要访问"授权"标题.

我的偏好是使用Lambda和Java 8进行设置,但是使用node.js的示例也有助于理解如何实现这一点.

小智 31

首先,您需要Authorization从HTTP GET请求中捕获标头.然后,您需要将该值映射到Lambda事件对象.

转到API方法仪表板,然后单击"方法请求".在那里你可以添加一个HTTP Request Header被调用Authorization,如下所示.

HTTP请求标头

这将捕获Authorization标题,以便您以后可以使用它.

现在返回方法仪表板并单击Integration Request.从这里,您可以使用这样的映射将标头的值传递给Lambda函数.

{
    "Authorization": "$input.params('Authorization')"
}
Run Code Online (Sandbox Code Playgroud)

现在,在Lambda函数中,您可以获得这样的值.

event.Authorization
Run Code Online (Sandbox Code Playgroud)


ken*_*gen 28

您可以在集成请求中使用以下映射模板,将所有路径,查询和标头参数一般映射到Lambda事件中.您仍然需要在API网关的"方法请求"部分中注册它们,但您至少可以将映射模板与要使用的特定参数分离.这样,每次更改标题,查询或路径参数时,都不必更改映射模板代码.

我写了一篇博文,给出了映射模板的更多细节和一些解释:http: //kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event -从-API网关/

这是您可以使用的映射模板:

{
  "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
  }  
}
Run Code Online (Sandbox Code Playgroud)


kix*_*orz 21

您需要Integration Request在仪表板屏幕上的面板内创建描述API方法的输入映射.

以下代码将name查询输入参数转换为Lambda Event input object:

{
   "name": "$input.params('name')"
}
Run Code Online (Sandbox Code Playgroud)

截图:

API Dashboard截图

您可以在AWS论坛上的原始API Gateway to Lambda输入线程中找到有关此内容的更多信息.

  • 另外,完成后,不要忘记保存更改并重新部署 API。 (2认同)

Pra*_*hat 12

虽然这是一个旧线程,但我发现最好将lambda代理集成用于此目的.有了这个,你不必在API网关中配置任何东西,你就可以获得lambda函数中的所有头文件......