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

时间:2015-07-12 20:20:28

标签: amazon-web-services aws-lambda aws-api-gateway

我在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的示例也有助于理解如何实现此目的。

7 个答案:

答案 0 :(得分:29)

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

转到API方法信息中心,然后单击“方法请求”。在那里,您可以添加名为HTTP Request Header的{​​{1}},如下所示。

HTTP Request Headers

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

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

Integration Request

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

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

答案 1 :(得分:27)

您可以在集成请求中使用以下映射模板,将所有路径,查询和标头参数一般映射到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
  }  
}

答案 2 :(得分:21)

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

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

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

截图:

API Dashboard screenshot

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

答案 3 :(得分:10)

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

答案 4 :(得分:1)

根据Prabhat的回答设置lambda代理集成请求是最简单的方法,之后您可以通过

访问请求标头,路径参数和查询参数
event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']

答案 5 :(得分:0)

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

... % "provided" withIsTransitive(true)

答案 6 :(得分:0)

这是示例事件对象:

{
"requestContext": {
    "elb": {
        "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/lambda-279XGJDqGZ5rsrHC2Fjr/49e9d65c45c6791a"
    }
},
"httpMethod": "GET",
"path": "/lambda",
"queryStringParameters": {
    "query": "1234ABCD"
},
"headers": {
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "accept-encoding": "gzip",
    "accept-language": "en-US,en;q=0.9",
    "connection": "keep-alive",
    "host": "lambda-alb-123578498.us-east-2.elb.amazonaws.com",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
    "x-amzn-trace-id": "Root=1-5c536348-3d683b8b04734faae651f476",
    "x-forwarded-for": "72.12.164.125",
    "x-forwarded-port": "80",
    "x-forwarded-proto": "http",
    "x-imforwards": "20"
},
"body": "",
"isBase64Encoded": false

}

事件对象中包含"headers",您可以使用以下命令访问发送到API网关的请求标头:event.headers.<header key>