it-roy-ru.com

Как получить идентификатор Cognito Identity в AWS Lambda

Как я могу получить идентификатор пользователя (зарегистрированного в AWS Cognito), который вызвал функцию AWS Lambda? Нужно ли использовать SDK для функции Lambda, чтобы получить идентификатор?

16
Renan

Для документов , похоже, информация о поставщике идентификационных данных будет доступна только для вызова через Mobile SDK.

Чтобы обойти это, можно передать идентификатор идентификатора функции вручную как часть события. Предполагая, что вы делаете что-то вроде AWS.config.credentials = new AWS.CognitoIdentityCredentials(...), вы сможете получить идентификатор через AWS.config.credentials.identityId (после обновления учетных данных).

EDIT: Лучшая опция для проверки личности - позволить Cognito/IAM ее обработать и предположить, что если пользователь может успешно вызывать функцию Lambda, это означает, что ему разрешено это делать. В этом случае, чтобы управлять проверкой пользователя, посмотрите на белый список .

4
William Gaul

В AWS javascript SDK внутри лямбда-функции просто используйте context.identity.cognitoIdentityIdЭто работает для меня

10
user966391

Если вы проходите через API Gateway, вы можете передать идентификатор Cognito (а также пользователя ARN и другую полезную информацию) в Lambda. Это решило проблему для меня. 

http://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

8
Stephen

Если кто-то еще наткнется на это, я думаю, это вам очень поможет.

Обратите внимание, что это применимо только в том случае, если вы используете Cognito User Pool Authorizer. Если вы хотите использовать AWS_IAM с Cognito Identitys, посмотрите мой пример на github https://github.com/VictorioBerra/js-cognito-auth-example (прочитайте раздел РЕДАКТИРОВАТЬ ниже)

Если у вас установлен флажок «Использовать интеграцию Lambda Proxy», то у вас не будет доступа к запросам сопоставлений шаблонов. Но вы можете перейти к утверждениям внутри токена в вашей лямбда-функции:

exports.handler = (event, context, callback) => {
    //create a response
    const response = {
      statusCode: 200,
      body: JSON.stringify({
          "user email": event.requestContext.authorizer.claims.email,
      }),
    };
    callback(null, response);    
};

EDIT - дополнительная информация для использования AWS_IAM в качестве авторизатора APIG

По сути, вам нужно защитить свой APIG с помощью AWS_IAM И вы должны авторизоваться с помощью Cognito Federated Identity, которая будет возвращать sessionToken пример, используя пулы пользователей . Это то, что делает учетные данные AWS IAM временными. Теперь у вас есть все необходимое для авторизации на вашем APIG.

Чтобы проверить это, загрузите настольную версию почтальона , добавьте свой URI API (захватите это из области этапов) и затем в разделе Авторизация заполните 5 полей, необходимых для подписи Sig4. Вы увидите, что объект 'event.identity' в вашей лямбда-функции загружен такими свойствами, как объект user.

Если вы хотите использовать автоматически генерируемый SDK APIG, он поставляется с фабрикой, которая принимает accessKey, secret и token и подписывает все для вас. То же самое с AWS-SDK. Вы можете инициировать учетные данные с этими тремя элементами, и он автоматически подпишет все запросы для вас с этими временными кредитами. Если вы хотите, чтобы вручную запустить интерфейс API с помощью window.fetch, request, curl, (вставьте http-клиент здесь), вы можете рассчитать свой собственный Sig4 (остерегайтесь, что это может быть немного сложнее или использовать современную библиотеку сделать это для вас .

Также, к сведению, во время моего исследования я заметил, что если вы не хотите использовать AWS_IAM в качестве авторизатора APIG и хотите использовать «Cognito Identity Pool Authorizer», который является новой необычной опцией в раскрывающемся списке в APIG, вы все равно можете получить тонна информации о пользователе в лямбда-событии, если вы просто передаете JWT, полученный в результате успешной аутентификации Cognito popl , в APIG в качестве заголовка авторизации. Внутри этого JWT много атрибутов, которые вы можете настроить в настройках вашего пула.

Профессиональное мнение IMO Я думаю, что использование авторизатора временных кредитов AWS_IAM является предпочтительным. Таким образом, вы можете использовать столько разных IdP, сколько пожелаете в Cognito Identities (Facebook, Twitter, пулы и т.д.)


2
Victorio Berra

Мое наблюдение следующее.

Если вы вызываете API-шлюз с подписанным запросом, где вы фактически предоставляете ключ доступа, secret и sessionToken, который вы можете извлечь через (JS SDK):

AWS.config.credentials = new AWS.CognitoIdentityCredentials(...)
AWS.config.credentials.get(..)

И предполагается, что ваша лямбда вызывается из API-шлюза через LAMBDA_PROXY и авторизатор AWS_IAM. Вы можете получить доступ к пользовательским материалам только в:

exports.create = function (event, context) {
   secdata = event.requestContext.identity.cognitoAuthenticationProvider;
}

Затем, помимо прочего, вы получите «sub» пользователя Cognito UserPool. Поэтому, если вы действительно хотите узнать больше о пользователе, вам, вероятно, нужно снова запросить AWS через SDK-вызов. 

0
Marc