如何使用Lambda访问HTTP标头以请求向AWS API Gateway的请求?

问题描述 投票:43回答:7

我在API Gateway FAQ中看到可以访问发送到API网关的请求标头...

如果您已经使用OAuth令牌或任何其他授权机制,您可以轻松设置API网关而不要求签名的API调用,然后将令牌标头转发到您的后端验证。

但是,在文档中找不到如何执行此操作的示例,目前尚不清楚如何使用Lambda访问此数据。

我能够设置一个开放的API并获得对POST(Walkthrough: API Gateway and Lambda Functions)中包含的JSON对象的访问权限,但是为了通过自己的提供者实现OAuth 2.0样式的API,我需要访问“授权”标题。

我的首选是使用Lambda和Java 8进行设置,但是使用node.js的示例也将有助于理解如何完成此操作。

amazon-web-services aws-lambda aws-api-gateway
7个回答
21
投票

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

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

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

截屏:

“

您可以在原始API Gateway to Lambda input thread on AWS Forums中找到有关此信息的更多信息。


31
投票

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

转到API方法仪表板,然后单击“方法请求”。您可以在其中添加一个名为HTTP Request HeaderAuthorization,如下所示。

“

这将捕获Authorization标头,以便以后使用。

现在返回方法仪表板,然后单击Integration Request。在这里,您可以使用类似的映射将标头的值传递给Lambda函数。

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

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

event.Authorization

28
投票

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

我写了一篇博客文章,其中提供了有关映射模板的更多详细信息和一些解释:http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

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

{
  "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
  }  
}

12
投票

虽然这是一个旧线程,但我发现最好为此目的使用lambda代理集成。这样,您不必在API网关中进行任何配置,并且可以在lambda函数中获得所有标头...


1
投票

根据Prabhat用lambda代理集成请求设置的答案是最简单的方法,之后您可以通过]访问请求标头,路径参数和查询参数>

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

0
投票

kennbrodhagen的解决方案对我来说非常有效,请参阅他的答案和博客以获取详细信息。由于发帖人表达了对Java实现的偏爱,并且花了我一段时间才弄清楚如何在Java中实现Kenn的处理程序,所以我只是共享对应的Java代码:


0
投票

这是示例事件对象:

© www.soinside.com 2019 - 2024. All rights reserved.