Как создать заголовок ответа интеграции Set-Cookie в AWS API Gateway? - PullRequest
3 голосов
/ 13 марта 2019

В настоящее время я использую API-шлюз Amazon для создания REST API, который напрямую взаимодействует с DynamoDB (с использованием типа интеграции «Сервис AWS» - между ними нет лямбды). Все работает, за исключением того, что я хотел бы вернуть заголовок Set-Cookie в первом ответе для использования с последующими вызовами API.

Для простоты (безопасность здесь не важна), я хотел бы использовать context.requestId в качестве значения cookie . Проблема в том, что заголовок Set-Cookie требует больше, чем просто значение cookie; как минимум, ему также нужно имя для файла cookie в форме CookieName=CookieValue, и реально я также хотел бы установить для него другие параметры, например дату истечения срока действия.

Однако, похоже, нет способа объединить переменную контекста с некоторым статическим текстом в «значение отображения заголовка», как мне нужно для вышеуказанного формата: https://docs.aws.amazon.com/apigateway/latest/developerguide/request-response-data-mappings.html#mapping-response-parameters

Итак, мой вопрос: Есть ли что-нибудь, что я могу поместить в поле "значение отображения заголовка", чтобы получить такое поведение? Что-то вроде 'id='+context.requestId, но верно? Я также был бы открыт для использования альтернативных методов настройки, таких как интерфейс командной строки AWS или импорт файла OpenAPI.

Для справки: это поле ввода шлюза API: enter image description here

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Если вы заинтересованы в использовании AWS CloudFront, это будет довольно просто. В CloudFront вы можете добавлять свои собственные заголовки с именем и значением, так как запросы оптимально маршрутизируются для вашего сайта:

AWS CloudFront Origin Editing

Надеюсь, это поможет!

0 голосов
/ 22 марта 2019

Простое сопоставление заголовков

Документация AWS о Ответ > Отображения заголовков > Значение отображения на странице https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-method-settings-execution-console.html

В качестве значения сопоставления используйте один из следующих форматов:

integra.response.header. header-name , где header-name - это имяоднозначный заголовок ответа от бэкэнда.Например, чтобы вернуть заголовок Date внутреннего ответа в качестве заголовка Timestamp ответа метода API, столбец Заголовок ответа будет содержать запись Timestamp и связанную с ним Значение сопоставления должно быть установлено на integra.response.header.Date ....

Так что выше сводится к тому, что поддерживается DynamoDB .И, посмотрев на один из примеров API, таких как GetItem в документах https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html#API_GetItem_ResponseElements

HTTP/1.1 200 OK
x-amzn-RequestId: <RequestId>
x-amz-crc32: <Checksum>
Content-Type: application/x-amz-json-1.0
Content-Length: <PayloadSizeBytes>
Date: <Date>
{ response json excluded for brevity}

Так что я бы, вероятно, попытался использовать значение заголовка x-amzn-RequestId в отображении

integration.response.header.x-amzn-RequestId

Возможно, что другие ответы не будут содержать этот заголовок, но в этом случае будет возможно включить трассировку запроса, которая в итоге приведет к выпадению X-Amzn-Trace-Id заголовка

Чтоеще можно сопоставить

Документы по сопоставлению параметров ответа AWS указать доступный синтаксис для сопоставлений:

+--------------------------------------+------------------------+
| Mapped Data Source                   | Mapping expression     |
+--------------------------------------+------------------------+
| Integration response header          | integration.response.header.PARAM_NAME |
| Integration response header          | integration.response.multivalueheader.PARAM_NAME |
| Integration response body            | integration.response.body |
| Integration response body (JsonPath) | integration.response.body.JSONPath_EXPRESSION |
| Stage variable                       | stageVariables.VARIABLE_NAME |
| Context variable                     | context.VARIABLE_NAME that must be one of the supported context variables. |
| Static value                         | 'STATIC_VALUE'. The STATIC_VALUE is a string literal and must be enclosed within a pair of single quotes. |
+--------------------------------------+------------------------+

Мы также знаем, что PARAM_NAME должно соответствовать регулярному выражению ^[a-zA-Z0-9._$-]+$ с этой же страницы документации.

Нет примеров, показывающих конкатенацию, хотя, даже если поддерживается синтаксис 'id='+context.requestId, нет ничего, что могло бы помешать его удалению в будущем.

Другая альтернатива - шаблоны сопоставления

Шлюз API использует Velocity Template Language (VTL) для обработки шаблонов сопоставления тела для интеграции.n запрос и ответ об интеграции.Шаблоны отображения преобразуют полезные нагрузки запроса метода в соответствующие полезные нагрузки запроса интеграции и переводят тела ответа интеграции в тела ответа метода.

Существует руководство по AWS - Использование шаблона отображения для переопределенияПараметры запросов и ответов API и коды состояния

Шаблон может выглядеть примерно так, как показано ниже.Я еще не проверял это:

#set($cookieName = "id")
#set($cookieNameValSeparator = "=")
$input.json("$")
#set($context.responseOverride.header.Set-Cookie = "$cookieName$cookieNameValSeparator$context.requestId")

...