使用Cognito用户池组调用没有联合身份的Lambda函数

时间:2018-05-30 05:28:27

标签: javascript browser aws-lambda aws-cognito

我是新手,觉得我错过了Cognito用户池组上的IAM角色与调用lambda函数之间的联系。

使用案例:我想使用Cognito来管理没有联合身份/池的用户帐户(我不需要联合)。 Cognito的一个功能是组的概念,用户可以在同一个池中分割成具有不同关联IAM角色的不同组(即"管理员""客户"等等) 。通过浏览器应用程序和JavaScript(在S3中)用户登录并获取accessToken(也是idToken和refreshToken)。到目前为止,一切都很好。

我的问题是我想使用' lambda.invoke'来调用函数。对于各种事物(即对DynamoDB的读写)并希望避免使用API​​网关的额外步骤。

browser-invoke-lambda-function-example我可以看到如何使用' AWS.CognitoIdentityCredentials',但据我所知,这需要联合身份。

Lambda class documentation还记录了如何使用IAM accessKeyId和secretAccessKey,但我想使用Cognito User Pool / Group-> Role中登录的用户凭据来调用Lambda函数。

具体 - 如果有人可以建议是否可以使用仅使用用户池和用户组的浏览器JavaScript中的lambda.invoke ,我会很感激(假设有一个与用户组关联的IAM角色)

如果可能,请提供一些示例代码/或方向,以便我了解具体方法。

PS:我意识到之前提出过类似的问题(即Is it possible to invoke a Lambda function with a cognito userpool identity? ),但细节上的问题很细,所以答案同样含糊不清。

2 个答案:

答案 0 :(得分:0)

我从浏览器端JavaScript调用Lambda。如果我没记错的话,您需要创建允许用户访问lambda的IAM角色。像这样完美地工作:

var lambda = new AWS.Lambda();

var params_lambda = {
  FunctionName: 'your_function_name',
  Payload: JSON.stringify(userPool.getCurrentUser().username) // data you want to send to lambda
};


lambda.invoke(params_lambda, function (err, data) {
  if (err) {
    console.log(err);
    window.location.href = "login.html";
  }
  else{
    console.log(JSON.parse(data.Payload)); // print out data you receive from lambda
  }
});

实例var lambda = new AWS.Lambda();需要

  

accessKeyId,

     

sessionToken

  

区域

答案 1 :(得分:0)

如果启用"联合身份池",则使用" Cognito提供商"仅(因为不需要联合身份),并且在提供者"身份验证角色选择"你选择"从令牌中选择角色"和#34;角色解析" DENY。

function test() { // eslint-disable-line no-unused-vars
    // Prepare to call Lambda function
    let pullResults;

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: <<IdentityPoolId>>,
      Logins: {
        "cognito-idp.<<REGION>>.amazonaws.com/<<USER POOL ID>>": <<idToken>>,
      },
    });

    const lambda = new AWS.Lambda({
      apiVersion: "2015-03-31",
    });

    const pullParams = {
      FunctionName: "<<Lambda Function Name>>",
      InvocationType: "RequestResponse",
      LogType: "None",
    };

    // Call the Lambda Function
    lambda.invoke(pullParams, function (err, data) {
      if (err) {
        console.log(err);
      } else {
        pullResults = JSON.parse(data.Payload);
        console.log(pullResults);
      }
    });
  }

虽然这会创建一个联合身份,但它不会使用Cognito Provider以外的任何内容,而是从用户所属的组中获取IAM角色。

有效:使用用户池中的Cognito用户,并根据分配给用户的用户组分配权限。