Можно ли вызвать лямбда-функцию с идентификатором пользовательского пула когнитивного типа?

Я хочу вызвать лямбда-функцию с помощью Javascript API.

Я хочу, чтобы он вызывался с учетными данными пользовательского пула когнито пользователя, который аутентифицирован в браузере.

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

Как я могу это сделать?

Благодарность


person Duke Dougal    schedule 06.03.2017    source источник


Ответы (2)


Вы можете сделать это, объединив токен пула пользователей с федеративным удостоверением Cognito, это даст вам временные учетные данные AWS для вызова функции AWS Lambda. Вам нужно будет создать пул удостоверений и создать роль с разрешением lambda: InvokeFunction.

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

person Vinay Kushwaha    schedule 06.03.2017

Ссылка: http://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools-javascript-examples.html

Вам понадобятся эти три пакета:

<script src="js/aws-cognito-sdk.min.js"></script>
<script src="js/amazon-cognito-identity.min.js"></script>
<script src="js/aws-sdk.min.js"></script>

После входа в систему с помощью Cognito вы можете вызвать функцию Lambda следующим образом:

function invokeMyLambda()
{
    if(!objCognitoUser) syncAwsFromCognito(); 
    var lambda = new AWS.Lambda({region: 'us-east-1', apiVersion: '2015-03-31'});
    // create JSON object for service call parameters
    var pullParams = {
       FunctionName : 'myLambFunctionName',
       InvocationType : 'RequestResponse', // Event | RequestResponse | DryRun
       LogType : 'None',
       Payload : JSON.stringify({ "yourKeyName": "Key Value to pass to the function in Event Object"}),
    };
    // invoke Lambda function, passing JSON object
    lambda.invoke(pullParams, function(err, data) {
       if (err) {
          console.log(err);
       } else {
          console.log(data);
          alert("Success: " + JSON.stringify(data));
       }
    });
    lambda = null;
}

function syncAwsFromCognito() {
    //    objCognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);

    if(!objCognitoUser) {
        objCognitoUser = objUserPool.getCurrentUser();
    }
    if (objCognitoUser) {
        objCognitoUser.getSession(function(err, result) {
        if (result) {
            if(AWS.config.credentials == null) // Refresh AWS Config credentials
                AWS.config.credentials = new AWS.CognitoIdentityCredentials(jsonUserCreds);
                AWS.config.credentials.params.Logins[strConfUserPoolID] = result.idToken.jwtToken;
            }
        });

        //call refresh method in order to authenticate user and get new temp credentials
        AWS.config.credentials.refresh( function (error) {
            if (error) {
                console.log('syncAwsFromCognito', error);
            }
        });
    }
    else
        alert("Session expired. Login again");
}

Вы можете выполнить вызов S3 непосредственно из Javascript, а также после завершения аутентификации Cognito. Я предпочитаю использовать REST API с API Gateway вместо прямого вызова функции Lambda из браузера. Это потому, что вызов функции Lambda зависит от TokenID, который действителен в течение часа, даже если вы выйдете из системы с помощью Cognito SDK.

person Bopaiah Mekerira    schedule 27.06.2017