2015-07-12 65 views
33

我在API Gateway FAQ,它可以访问发送到API网关请求头看......如何使用Lambda访问HTTP标头以请求AWS API网关?

如果你已经使用OAuth凭证或其他授权 机制,你可以轻松地设置API网关不要求签名的API 调用,并简单地将令牌标头转发到您的后端以进行 验证。

但是,我找不到如何在文档中这样做的示例,并且不清楚如何使用Lambda访问此数据。

我能够设置一个开放的API并访问属于POST(Walkthrough: API Gateway and Lambda Functions)一部分的JSON对象,但为了使用我自己的提供者实现OAuth 2.0样式的API,我需要访问“授权“标题。

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

回答

19

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

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

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

截图:

API Dashboard screenshot

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

+1

访问请求标头,路径参数和查询参数。另外,一旦完成,请不要忘记保存更改并重新部署您的API。 – kixorz

27

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

转到API方法仪表板,然后单击方法请求。在那里你可以添加一个叫做AuthorizationHTTP Request Header,如下所示。

HTTP Request Headers

这将捕获Authorization头,所以你以后可以使用它。

现在回到方法仪表板并点击Integration Request。从这里你可以通过使用像这样的映射将头部的值传递给Lambda函数。

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

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

event.Authorization 
25

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

这是一个耻辱,我只能一次:),花了这么多时间,当我使用'$ input.json('$')'得到整个身体我不能再使用'$ input.params( )'来获取标题,这很奇怪,它适用于VTL。无论如何非常感谢! – Tiago

4

,虽然这是一个古老的线程,我已经发现最好使用lambda代理集成。有了这个,你不必在API网关中配置任何东西,并且你可以在你的lambda函数中得到所有的头文件...

+0

我可以确认这是现在完成请求头部转发的最佳方法,也是我在几个项目中使用过的,因为我问了这个问题。然而,由于我原来的问题是面向头部转发配置,所以我不会改变接受的答案。 – JaredHatfield

0

根据Prabhat的设置与lambda代理集成请求的答案是最简单的方法来做到这一点,之后,您可以通过

event['pathParameters']['param1'] 
event["queryStringParameters"]['queryparam1'] 
event['requestContext']['identity']['userAgent'] 
event['requestContext']['identity']['sourceIP'] 
相关问题