【问题标题】:Fine Grained access management with AWS Cognito and API Gateway使用 AWS Cognito 和 API Gateway 进行细粒度访问管理
【发布时间】:2016-07-12 01:47:12
【问题描述】:

我有几组用户(在 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,这可以确保给定用户有权执行操作)。

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

【问题讨论】:

  • 您与 API Gateway 使用哪种集成? HTTP 代理、Lambda 函数或 AWS 服务代理?
  • 不同的。但主要是 lambda。

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


【解决方案1】:

您可以使用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 Gateway 集成配置中,您可以pass the Cognito pool and identity to the lambda。然后,在 Lambda 中,您知道调用者的身份(如果您需要有关用户身份的更多信息,可以致电 Cognito API)。

您将能够创建可能类似于 GET /user/me/my-resource 的端点,并将根据 API 网关调用者的 Cognito 身份执行操作。您无需为 Cognito 身份池中的每个身份创建 x 个端点和策略。

【讨论】: