Можно ли добавить HTTP-заголовок из пользовательской аутентификации AWS на шлюзе API?

Я использую Custom Auth на AWS API Gateway, но я хотел бы добавить дополнительный HTTP-заголовок в зависимости от результата. Кто-нибудь знает, возможно ли это, или как это сделать. Если нет, есть ли идея, когда это станет возможным?

Большое спасибо.


person Craig Stewart-Thomson    schedule 14.11.2016    source источник


Ответы (4)


Недавно мы добавили поддержку для этого. Документы должны скоро появиться.

Теперь вы можете вернуть такой объект из функции авторизатора:

{
  "principalId": "xxxxxxxx", // The principal user identification associated with the token send by the client.
  "policyDocument": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow|Deny",
        "Resource": "arn:aws:execute-api:<regionId>:<accountId>:<appId>/<stage>/<httpVerb>/[<resource>/<httpVerb>/[...]]"
      }
    ]
  },
  "context" : {
    "key" : "value",
    "numKey" : 1,
    "boolKey" : true
  }
}

Массивы и объекты не допускаются, только строка/число/логическое значение как допустимый JSON. Корневой ключ должен называться context.

Вы можете получить доступ к этим значениям в контексте запроса $context следующим образом:

$context.authorizer.key -> value 
$context.authorizer.numKey -> 1
$context.authorizer.boolKey -> true

Итак, чтобы ответить на ваш вопрос, вы не сможете условно добавить заголовок, но вы можете установить значение заголовка $context.authorizer.yourKey, и если yourKey не установлено в авторизаторе ответ, значение заголовка будет пустым (но заголовок все равно будет отправлен).

Изменить:

Документы доступны http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html

person jackko    schedule 17.11.2016
comment
Отметить как правильный ответ? Это может быть самая полная документация по новой функциональности, пока наша документация не будет запущена :) - person jackko; 18.11.2016
comment
@ JackKohn-AWS, это работает, если вы используете Mock? Я пытаюсь использовать $context.authorizer.principalId в сопоставлении тела запроса на интеграцию, и это выдает ошибку. - person Greg Fennell; 16.12.2016
comment
Сопоставление тела запроса на интеграцию должно быть точно таким же, как { "statusCode":200} для фиктивной интеграции. Если вам нужно имитировать полезные данные ответа, вы должны использовать шаблон сопоставления ответа интеграции. - person jackko; 16.12.2016
comment
Просто предостережение: интеграция прокси-сервера Lambda теряет тип значений контекста, т. Е. Все строковые, числовые и логические значения будут передаваться как строки. - person dinvlad; 05.09.2017
comment
Как это сделать с помощью cloudformation? - person Jimson Kannanthara James; 12.01.2021

Я смог заставить это работать после дня, когда выдергивал волосы, и, надеюсь, я смогу спасти кого-то от этого. Это добавляет немного больше к ответу Джека. По сути, вы можете динамически добавлять заголовки с помощью шаблонов сопоставления тела.

  1. Создайте и лямбда-авторизатор (вы можете использовать лямбда-схему авторизатора для начала), выполните свою бизнес-логику, чтобы создать AuthPolicy и заполнить объект context ключом/значением.
  2. На шлюзе API выберите ресурс, нажмите Запрос метода и установите Auth на лямбда-выражение авторизатора.
  3. Откройте Выполнение метода, выберите тип интеграции и не забудьте отменить выбор Использовать интеграцию с лямбда-прокси (если ваш запрос указывает на лямбда-выражение)
  4. Добавьте шаблон сопоставления тела — создайте его из шаблона, и именно здесь у вас будет доступ к $context.authorizer.key.
  5. Добавьте в свой шаблон следующее (прямо под «body-json»: $input.json('$')," подойдет)
"headers": {
     "key-header" : "$util.escapeJavaScript($context.authorizer.key)",
     #foreach($param in $input.params().header.keySet())
         "$param": "$util.escapeJavaScript($input.params().header.get($param))" 
         #if($foreach.hasNext),#end
     #end },

Это добавит новый заголовок под названием «key-header», а также перенаправит все исходные заголовки, что позволит вам добавить дополнительную информацию, такую ​​​​как user_id, user_role и т. д., в восходящую службу.

person Emanuel Canha    schedule 13.12.2017

Я попробовал ответ Эмануэля Каньи выше, но это больше не работает. То, как я заставил это работать вчера (5 июня 2019 г.), состоит в том, чтобы

  1. Создайте лямбду
  2. Добавьте лямбду в разделе Запрос метода в качестве авторизатора.
  3. Откройте Запрос на интеграцию.
  4. Открытые заголовки HTTP
  5. Добавьте заголовок с нужным вам именем (key-header в приведенном выше примере)
  6. Используйте context.authorizer.yourKey в качестве записи отображенной. (Обратите внимание, что вы не используйте $ в этом поле.)
person Martien Verbruggen    schedule 06.06.2019

Вы можете получить PrincipalId только из результата авторизации, в вашем запросе на интеграцию вы можете сопоставить значение заголовка, используя context.authorizer.principalId

person taskiner    schedule 14.11.2016