【问题标题】:Use Cognito User Pool Groups to Invoke a Lambda function without Federated Identities使用 Cognito 用户池组调用没有联合身份的 Lambda 函数
【发布时间】:2018-11-08 20:25:30
【问题描述】:

我是新手,我觉得我缺少 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 用户池/组->角色的登录用户凭证来调用 Lambda 函数。

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

如果可能,请提供一些示例代码/或指导,我可能会找到方法。

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

【问题讨论】:

    标签: javascript browser aws-lambda aws-cognito


    【解决方案1】:

    如果您启用“联合身份池”,仅使用“Cognito 提供者”(因为不需要联合身份),并且在提供者“身份验证角色选择”下选择“从令牌中选择角色”和“角色解析”拒绝。

    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 提供者以外的任何东西,并且它从用户所属的组中获取 IAM 角色。

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

    【讨论】:

      【解决方案2】:

      我正在从浏览器端 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,

      会话令牌

      地区

      【讨论】:

      • 我希望这不是一个愚蠢的问题...@tipsfedor 仅使用用户池时您从哪里获得 accessKeyId?
      猜你喜欢
      • 2018-02-11
      • 2018-11-07
      • 2018-08-23
      • 1970-01-01
      • 2017-02-28
      • 2021-05-05
      • 2018-10-08
      • 2019-06-17
      • 2017-04-16
      相关资源
      最近更新 更多