是否可以使用cognito userpool身份调用Lambda函数?

时间:2017-03-06 07:02:05

标签: javascript aws-lambda amazon-cognito

我想使用Javascript API调用Lambda函数。

我希望使用在浏览器上进行身份验证的用户的cognito userpool凭据来调用它。

目标是Lambda函数与来自cognito userpool的用户具有相同级别的S3访问权限。

我该怎么做?

谢谢

2 个答案:

答案 0 :(得分:2)

您可以通过将用户池令牌与Cognito联合身份联合来执行此操作,这将为您提供临时AWS凭据以调用AWS Lambda函数。您需要创建一个标识池并使用权限 lambda:InvokeFunction 创建一个角色。

还要记住,如果选择基于身份验证角色的解析,用户池的所有用户都可以调用lambda函数,如果要将其限制为用户子集,则可以使用用户池中的组和令牌或联合身份中基于规则的映射以确定角色。

答案 1 :(得分:-1)

参考: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");
}

完成Cognito身份验证后,您也可以直接从Javascript进行S3调用。我更喜欢使用REST API和API Gateway,而不是从浏览器直接使用Lambda函数调用。那是因为Lambda函数调用依赖于TokenID,即使您使用Cognito SDK注销,它也有效一小时。