首页 文章

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

提问于
浏览
39

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

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

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

我能够设置一个开放的API并获得对作为POST(Walkthrough: API Gateway and Lambda Functions)一部分的JSON对象的访问权限,但是为了使用我自己的提供程序实现OAuth 2.0样式API,我需要访问"Authorization"标头 .

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

6 回答

  • 10

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

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

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

    截图:

    API Dashboard screenshot

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

  • 0

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

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

    HTTP Request Headers

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

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

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

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

    event.Authorization
    
  • 1

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

    我写了一篇博文,给出了映射模板的更多细节和一些解释: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
      }  
    }
    
  • 20

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

  • 28

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

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

    kennbrodhagen的解决方案对我很有帮助,请参阅他的答案和博客了解详细信息 . 由于海报表达了对Java实现的偏好,并且花了一些时间来弄清楚如何在java中实现Kenn的处理程序,我只是分享对应的Java代码:

    public class MyHandler implements RequestHandler<Map<String,Object>,String> {
    
        @Override
        public String handleRequest(Map<String,Object> eventMap, Context context) {
            LambdaLogger logger = context.getLogger();
            logger.log("Body:" + eventMap.get("body"));
            logger.log("Headers:" + eventMap.get("headers"));
            logger.log("Method:" + eventMap.get("method"));
            logger.log("Params:" + eventMap.get("params"));
            logger.log("Query:" + eventMap.get("query"));
            return("{}");
        }
    }
    

相关问题