it-swarm.com.ru

Как получить доступ к заголовкам HTTP для запроса к AWS API Gateway с помощью Lambda?

Я вижу в шлюзе API FAQ что можно получить доступ к заголовкам запросов, отправленных на шлюз API ...

Если вы уже используете токены OAuth или любую другую авторизацию Механизм, вы можете легко настроить API-шлюз, не требуя подписанного API звонки и просто перенаправьте заголовки токена на ваш сервер для проверка.

Тем не менее, я не могу найти пример того, как это сделать в документации, и неясно, как получить доступ к этим данным с помощью Lambda.

Я могу настроить открытый API и получить доступ к объекту JSON, который является частью POST ( Пошаговое руководство: API Gateway и Lambda Functions ), но для реализации API стиля OAuth 2.0 со своим провайдером мне нужен доступ к заголовку «Авторизация».

Я предпочитаю настроить это с помощью Lambda и Java 8, но пример с использованием node.js также поможет понять, как этого добиться.

40
JaredHatfield

Вам необходимо создать отображение ввода внутри панели Integration Request на экране панели инструментов, описывающей ваш метод API.

Следующий код переводит входной параметр запроса name в Lambda Event input object:

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

Скриншот:

API Dashboard screenshot

Дополнительную информацию об этом можно найти в исходной теме Вводная строка API Gateway to Lambda на форумах AWS .

21
kixorz

Во-первых, вам нужно перехватить заголовок Authorization из HTTP-запроса GET. Затем вам нужно отобразить это значение на объект события Lambda.

Перейдите на панель методов API и нажмите «Запрос метода». Там вы можете добавить HTTP Request Header с именем Authorization, как показано ниже.

HTTP Request Headers

Это перехватит заголовок Authorization, чтобы вы могли использовать его позже.

Теперь вернитесь на панель методов и нажмите Integration Request. Отсюда вы можете передать значение заголовка в функцию Lambda, используя такое отображение.

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

Теперь в вашей лямбда-функции вы можете получить такое значение.

event.Authorization
28
David Fevre

Вы можете использовать следующий шаблон сопоставления в запросе на интеграцию для общего сопоставления всех параметров пути, запроса и заголовка с событием Lambda. Вам все равно нужно будет зарегистрировать их в разделе «Запрос метода» шлюза API, но вы можете по крайней мере отделить шаблон сопоставления от определенных параметров, которые вы хотите использовать. Таким образом, вам не нужно менять код шаблона отображения каждый раз, когда вы меняете заголовки, запросы или параметры пути.

Я написал сообщение в блоге, которое дает более подробную информацию и некоторые объяснения шаблона картирования: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda -внутри от 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
  }  
}
26
kennbrodhagen

хотя это старая ветка, я считаю, что для этой цели лучше всего использовать лямбда-прокси-интеграцию. При этом вам не нужно ничего настраивать в шлюзе API, и вы получаете все заголовки в вашей лямбда-функции ...

10
Prabhat

Согласно ответу Прабхата, настройка лямбда-прокси-запроса на интеграцию является самым простым способом сделать это, после чего вы можете получить доступ к заголовкам запроса, параметрам пути и параметрам запроса через 

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

Решение от kennbrodhagen отлично сработало для меня, подробности смотрите в его ответе и блоге. Поскольку автор выражал предпочтение реализации Java, и мне потребовалось некоторое время, чтобы понять, как реализовать обработчик Кенна в Java, я просто делюсь кодом 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("{}");
    }
}
0
mojoken