Javascript 使用Cognito用户池组在没有联邦标识的情况下调用Lambda函数

Javascript 使用Cognito用户池组在没有联邦标识的情况下调用Lambda函数,javascript,browser,aws-lambda,aws-cognito,Javascript,Browser,Aws Lambda,Aws Cognito,我是一个新手,我觉得在Cognito用户池组上的IAM角色和调用lambda函数之间缺少连接 用例:我想使用Cognito来管理没有联邦身份/池的用户帐户(我不需要联邦)。Cognito的一个特性是组的概念,用户可以被划分为不同的组,具有不同的关联IAM角色,所有这些角色都在同一个池中(即“管理员”、“客户”等)。通过浏览器应用程序和JavaScript(在S3中)用户登录并获得accessToken(也是idToken和refreshToken)。在这一点上,一切都很好 我的问题是,我想使用“

我是一个新手,我觉得在Cognito用户池组上的IAM角色和调用lambda函数之间缺少连接

用例:我想使用Cognito来管理没有联邦身份/池的用户帐户(我不需要联邦)。Cognito的一个特性是组的概念,用户可以被划分为不同的组,具有不同的关联IAM角色,所有这些角色都在同一个池中(即“管理员”、“客户”等)。通过浏览器应用程序和JavaScript(在S3中)用户登录并获得accessToken(也是idToken和refreshToken)。在这一点上,一切都很好

我的问题是,我想使用“lambda.invoke”调用函数来处理各种事情(即对DynamoDB的读写),并希望避免使用API网关的额外步骤

从中,我可以看到如何使用“AWS.CognitoIdentityCredentials”来实现这一点,但从我可以看出,这需要联邦身份

还记录了如何使用IAM accessKeyId和secretAccessKey,但我想使用Cognito用户池/组->角色中登录的用户凭据调用Lambda函数

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

如果可能的话,请提供一些示例代码/或说明,我可以从中了解如何使用


PS:我意识到以前也提出过类似的问题(即),但问题的细节太少,所以答案同样模糊。

我从浏览器端JavaScript给Lambda打电话。如果我没记错的话,您需要创建IAM角色,允许您的用户访问lambda。这样做非常好:

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

区域


如果启用“联合身份池”,仅使用“Cognito提供程序”(因为不需要联合身份),并且在提供程序“身份验证角色选择”下选择“从令牌选择角色”和“角色解析”拒绝,则以下操作有效

function test(){//eslint禁用行无未使用的变量
//准备调用Lambda函数
让我们看看结果;
AWS.config.credentials=新的AWS.CognitoIdentityCredentials({
IdentityPoolId:,
登录:{
“cognito idp..amazonaws.com/”:,
},
});
常数λ=新AWS.lambda({
apiVersion:“2015-03-31”,
});
常量pullParams={
函数名:“”,
调用类型:“请求响应”,
日志类型:“无”,
};
//调用Lambda函数
调用(pullParams,函数(err,data){
如果(错误){
控制台日志(err);
}否则{
pullResults=JSON.parse(data.Payload);
console.log(pullResults);
}
});
}
虽然这会创建一个联邦身份,但它只使用Cognito提供者,并且它从用户所属的组中获取IAM角色


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

我希望这不是一个愚蠢的问题@提示:仅使用用户池时,从何处获取accessKeyId?
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);
      }
    });
  }