使用AWS Cognito和API Gateway进行细粒度访问管理

时间:2016-07-07 10:36:54

标签: amazon-web-services amazon-cognito aws-api-gateway

我有几组用户(在Cognito中有自己的身份池),它们在API网关中对端点具有不同的权限。我使用IAM角色管理访问权限。例如,我有一个标识池的策略:

{
    "Sid": "Stmt1467885818000",
    "Effect": "Allow",
    "Action": [
        "apigateway:Invoke"
    ],
    "Resource": [
        "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/usergroup/*"
    ]
}

现在我希望拥有基于一个个人身份的访问规则。原因是,我有一些资源,我只能由用户改变这些资源" onws"资源(或列为允许访问资源)。

我可以以某种方式为此用户IAM吗? 我的想法是这样的:

"Resource": [
        "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/<my-user-name>/*"
    ]

所以这样每个用户只能使用他的用户名(而且这个用户名可以转发到lambda,这可以确保给定用户有权执行操作)。

这可能吗?如果不是,我将如何配置细粒度访问?

1 个答案:

答案 0 :(得分:0)

您可以使用IAM conditions来检查用户身份。看一下this blog post以查看更多示例。它应该是这样的:

{
    "Effect": "Allow",
    "Action": [
        "apigateway:Invoke"
    ],
    "Resource": [
        "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/<my-user-name>/*"
    ],
    "Condition": {
        "StringEquals": {
            "cognito-identity.amazonaws.com:aud": "us-east-1:<identity-pool-id>",
            "cognito-identity.amazonaws.com:sub": "us-east-1:<identity-id>"
        }
    }
}

但我会建议你采取不同的行动。

在API网关集成配置中,您可以pass the Cognito pool and identity to the lambda。然后,在Lambda中,您知道调用者的身份(如果您需要有关用户身份的更多信息,可以调用Cognito API。)

您将能够创建可能看起来像GET /user/me/my-resource的端点,并且将根据API网关呼叫者的Cognito身份执行操作。您无需为Cognito标识池中的每个标识创建 x 端点和策略。