具有 IAM 权限的 Cognito 组

Mal*_*rkb 8 user-management amazon-web-services amazon-iam amazon-cognito aws-api-gateway

我想要实现的:

我有一个 Cognito 用户池,我有一些用户和一些组。我希望某些用户可以访问 API 网关功能,某些用户可以访问某些功能,而其他用户则没有访问权限。

我做了什么:

我创建了三个组并将用户分配给每个组。我为每个组分配了一个 IAM 角色,并为每个角色分配了特定的策略。所有用户的组权限如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "execute-api:*",
            "Resource": "*"
        }
     ]
}
Run Code Online (Sandbox Code Playgroud)

我通过无服务器框架创建了 Lambda 函数和 API 网关资源。我将授权方设置为 Cognito 用户池授权方。

(我尝试了几种不同的方法,例如使用联合身份,但这似乎也不起作用)

我的结果是什么:

所有用户都拥有对 API 网关的完全访问权限。给定的权限似乎对每个用户的访问没有任何影响。

求助:我做错了什么?我怎样才能实现我的目标?

ASR*_*ASR 6

附加到 a 的角色user pool group仅在您使用Cognito Federated Identity. 将组添加到用户池

IAM 角色及其权限与 Amazon Cognito 身份池为经过身份验证的用户提供的临时 AWS 凭证相关联。当 Amazon Cognito Federated Identities 使用从令牌中选择角色选项提供 AWS 凭证时,组中的用户会自动分配到该组的 IAM 角色。

所以基本上

  1. 创建一个identity pool附加到您的用户池。
  2. 将 API 网关的授权更改为 IAM
  3. 登录用户池后,用户id_token生成federated identity
  4. 使用此身份 ( secret key + access key + token) 对 API 网关进行授权。

现在你的角色应该受到尊重。但请注意 - 您将需要自己生成 AWS SigV4 凭证,因为出于某种原因,这不是开箱即用的。我最终使用aws-sign-web在浏览器中使用。

PS:您的角色似乎可以全面访问 API 网关。你也需要解决这个问题。例如,我用来限制对一个 API 端点的访问的示例角色

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": "execute-api:Invoke",
        "Resource": [
            "arn:aws:execute-api:us-east-2:<aws account id>:<API id>/*/*/acc/*"
        ],
        "Effect": "Allow"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

要生成的示例代码 federated identity

function getAccessToken(idToken, idenPoolId, userPool) {
        let region = idenPoolId.split(":")[0];
        let provider = "cognito-idp." + region + ".amazonaws.com/" + userPool;
        let login = {};

        login[provider] = idToken;

        // Add the User's Id Token to the Cognito credentials login map.
        let credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: idenPoolId,
            Logins: login
        });

        //call refresh method in order to authenticate user and get new temp credentials
        credentials.get((error) => {
            if (error) {
                console.error(error);

                //let response = {
                //  statusCode: 500,
                //  body: JSON.stringify(error)
                //};

                return null;

            } else {
                console.log('Successfully logged!');
                console.log('AKI:'+ credentials.accessKeyId);
                console.log('AKS:'+ credentials.secretAccessKey);
                console.log('token:' + credentials.sessionToken);

                let response = JSON.stringify({
                    'AKI': credentials.accessKeyId,
                    'AKS': credentials.secretAccessKey,
                    'token': credentials.sessionToken
                });

                return response;
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)