Авторизация доступа к прокси-серверу AWS ApiGateway Lambda

Я использую лямбда-прокси и авторизатор пула пользователей Cognito в своем ApiGateway. В функции Lambda я могу получить доступ к переменным пути и т. Д. Через объект события. В дополнение к этому я хочу получить доступ к утверждениям аутентифицированного пользователя. В документации написано, что я должен использовать:

context.authorizer.claims.property

Но я авторизирую нуль, поэтому я получаю

Cannot read property 'claims' of undefined

У кого-нибудь есть идея?


person SnowMax    schedule 20.02.2017    source источник


Ответы (2)


Если вы имеете в виду эту часть документации, $context.authorizer.claims является частью шаблона сопоставления интеграции. Это не связано с context аргументом обработчика.

Используя Lambda Proxy integration, вы используете passthrough mapping template. I̶t̶ ̶s̶e̶e̶m̶s̶ ̶w̶h̶a̶t̶ ̶i̶t̶ ̶d̶o̶e̶s̶ ̶n̶o̶t̶ ̶i̶n̶c̶l̶u̶d̶e̶ ̶w̶h̶a̶t̶ ̶y̶o̶u̶ ̶a̶r̶e̶ooo Возможно, вам придется отключить Lambda Proxy integration и использовать что-то вроде этого в шаблоне сопоставления:

{
    "identity" : {
        "sub" : "$context.authorizer.claims.sub",
        "email" : "$context.authorizer.claims.email"
    }
}

Шаблон сопоставления «строит» параметр event лямбды. Таким образом, вы сможете получить доступ к частям своей претензии через параметр event.

exports.handler = (event, context, callback) => {
    // TODO implement
    callback(null, event.identity.email);
};

Обратите внимание, что я немного изменил пример документации, чтобы избежать еще одной путаницы в отношении того, что может быть context:

  • переменная шаблона сопоставления в API Gateway
  • второй аргумент обработчика в Lambda
  • ключ аргумента event в некоторых примерах документации ‹= Я переименовал его в identity

Изменить

Как указывает doorstuck, информация доступна с помощью интеграции с прокси

person Alexis N-o    schedule 20.02.2017
comment
Спасибо за подробный ответ. Когда я отключу интеграцию прокси, я не смогу получить доступ к таким свойствам, как path, queryString и т. Д.? - person SnowMax; 21.02.2017
comment
Вы также сможете сделать это с помощью шаблона сопоставления. Я бы посоветовал выбрать сквозной шаблон запроса метода и дополнить его тем, что вам нужно. - person Alexis N-o; 21.02.2017
comment
Работает! Спасибо ;) - person SnowMax; 21.02.2017
comment
@SnowMax @Alexis N-o Похоже, много работы. Вы можете получить доступ к утверждениям авторизатора в event.requestContext.authorizer.claims с помощью интеграции Lambda Proxy. - person doorstuck; 21.02.2017

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

event.requestContext.authorizer.claims

Вы можете попробовать console.log(event); и просмотреть информацию, полученную в результате интеграции прокси-сервера Lambda, в журналах CloudWatch.

person doorstuck    schedule 21.02.2017
comment
Приятно, что сквозной запрос метода не содержит его, если не используется интеграция с лямбда-прокси. Я думал, что будет использоваться тот же шаблон сопоставления. - person Alexis N-o; 21.02.2017