Аутентифицироваться как администратор Cognito с помощью Lambda IAM Role - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь использовать SDK для выполнения действий администратора в моем пуле пользователей Cognito из функции Lambda, но я не могу понять, как правильно проходить проверку подлинности в качестве администратора. В идеале я хотел бы просто выполнить роль, которую моя функция уже использует, но мне пока не удалось выполнить эту работу, и я не уверен, возможно ли это вообще. Если это возможно, что мне нужно сделать, чтобы это работало? Если это невозможно, как правильно достичь этого? Нужно ли создавать администратора в пуле пользователей, а затем проходить аутентификацию, используя имя пользователя и пароль?

Редактировать: я реализовал совет Мэтта с помощью приведенного ниже кода, но я только что получил пустой объект из Cognito (буквально просто {} появляется в журналах), и я не уверен, почему. После прочтения документации я должен получить либо данные, либо ошибки. Обновление происходит, поэтому я знаю, что оно работает, я просто ожидал получить подтверждение, кто-нибудь знает, должен ли я получить что-то обратно?

let cogUser;

const params = {
    UserAttributes: [{ 
        Name: "email",
        Value: args.input.email
    }],
    UserPoolId: context.userpool_id,
    Username: context.user
};

log.debug('Cog user params: ', params);

try {
    cogUser = await context.conns.cognito.adminUpdateUserAttributes(params).promise();
} catch(err) {
    log.error('Coguser threw error: ', err);
}

log.debug('Coguser return: ', cogUser);

Редактировать 2: Попытка использовать обратный вызов вместо обещаний.

context.conns.cognito.adminUpdateUserAttributes(params, function(err, data) {
    if (err) { 
        console.log(err) 
    } else {
        cogUser = data;
    }
});

1 Ответ

0 голосов
/ 08 января 2019

Если вы хотите использовать роль IAM, уже привязанную к функции Lambda, вы можете просто отредактировать роль в консоли AWS и добавить соответствующие политики для роли (в зависимости от того, что вы пытаетесь выполнить).

Например, вы можете просто добавить предварительно настроенную политику AmazonCognitoPowerUser к роли (см. Ниже):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cognito-identity:*",
                "cognito-idp:*",
                "cognito-sync:*",
                "iam:ListRoles",
                "iam:ListOpenIdConnectProviders",
                "sns:ListPlatformApplications"
            ],
            "Resource": "*"
        }
    ]
}

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

После этого вы можете напрямую вызывать API-интерфейсы Cognito Admin (см. Пример ниже):

exports.handler = (event, context, callback) => {
    var AWS = require('aws-sdk');
    var CognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'});

    var params = {
        UserAttributes: [{
            Name: `custom:${event.attribute}`,
            Value: event.value
        }],
        UserPoolId: 'us-east-1_example',
        Username: event.username
    }

    CognitoIdentityServiceProvider.adminUpdateUserAttributes(params, function(err, data) {
        if (err) { console.log(err) }
        context.done(null, data);
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...