gpt4 book ai didi

amazon-web-services - 具有 IAM 权限的 Cognito 组

转载 作者:行者123 更新时间:2023-12-04 02:55:42 24 4
gpt4 key购买 nike

我想要实现的:

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

我做了什么:

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

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "execute-api:*",
"Resource": "*"
}
]
}

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

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

我的结果是什么:

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

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

最佳答案

附加到 user pool group 的角色只有在您使用 Cognito Federated Identity 为用户生成凭据时才会出现. Adding groups to a user pool

IAM roles and their permissions are tied to the temporary AWS credentials that Amazon Cognito identity pools provide for authenticated users. Users in a group are automatically assigned the IAM role for the group when AWS credentials are provided by Amazon Cognito Federated Identities using the Choose role from token option.



所以基本上
  • 创建一个 identity pool附加到您的用户池。
  • 将 API 网关的授权更改为 IAM
  • 登录用户池后,用户id_token生成 federated identity
  • 使用此身份 ( 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"
    }
    ]
    }

    生成示例代码 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;
    }
    });
    }

    关于amazon-web-services - 具有 IAM 权限的 Cognito 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51502773/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com