未授权与Cognito用户

时间:2016-08-30 12:46:47

标签: amazon-web-services lambda policy amazon-cognito

使用AWS-Cognito-Identity-Js我为经过身份验证的Cognito用户获取会话ID令牌session.getIdToken().getJwtToken()

我将此token传递给我的AWSInitialize函数并更新AWS凭据:

var AWSInitialize = function(token){
  Logins = {};
  Logins['cognito-idp.' + AWSCognito.config.region + '.amazonaws.com/' + poolData.UserPoolId] = token;

  AWS.config.update({
    region: AWSCognito.config.region,
    credentials: new AWS.CognitoIdentityCredentials({
        IdentityPoolId : identityPoolId,
        region: AWSCognito.config.region,
        Logins : Logins
    })
  });
};

这是正常的,因为现在我可以代表经过身份验证的Cognito用户执行Lambda-Function。

 var lambda = new AWS.Lambda({});
 lambda.invoke({FunctionName: 'createToken'}, function(err, data) ...

这是可能的,因为在Cognito_myAppAuth_Role我附加了一个允许我执行此Lambda函数的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1471300653000",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:eu-west-1:593845191076:function:createToken"
            ]
        }
    ]
}

现在我要做的是为相同的用户获取带有STS的令牌

为此,我将另一项政策附加到Cognito_myAppAuth_Role。它应该允许Cognito用户拨打assumeRoleWithWebIdentity

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1472560044000",
            "Effect": "Allow",
            "Action": [
                "sts:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

但是当我运行此代码时:

var sts = new AWS.STS({});

var params = {
  RoleArn: 'arn:aws:iam::593845191076:role/Cognito_myAppAuth_Role', /* required */
  RoleSessionName: "UserName", /* required */
  WebIdentityToken: token, /* required */
};

sts.assumeRoleWithWebIdentity(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

我收到以下错误:

  AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity

我不明白为什么用户无权执行sts:AssumeRoleWithWebIdentity。对于经过身份验证的角色,我附加了STS策略,而Lambda-Policy也在为用户工作

问题出在哪里? 我该如何解决这个问题?

非常感谢!

1 个答案:

答案 0 :(得分:3)

我怀疑这次失败的原因是您尝试直接使用Cogno您的用户池令牌与STS。虽然我不再直接在Cognito上工作,但我认为这不会起作用。

您应该尝试以下方法之一:

  1. 推荐)使用Cognito联合身份调用GetIdGetCredentialsForIdentity获取临时凭据。这就是你的第一个代码块正在做什么。
  2. 使用Cognito联合身份调用GetIdGetOpenIdToken,然后在AssumeRoleForWebIdentity来电中使用 令牌。
  3. 希望这有帮助。