【问题标题】:AWS Cognito and AWS Api Gateway authorizations of users application用户应用程序的 AWS Cognito 和 AWS Api Gateway 授权
【发布时间】:2019-12-22 08:45:31
【问题描述】:

我正在使用 AWS Cognito 进行与我的应用程序相关的身份验证。因为我也在使用 AWS Api Gateway 在我的应用程序中使用 Lambda,所以我需要在网关上设置安全级别。

在我的应用程序中会有很多用户,反过来,也会有不同的角色(如管理员、营销、管理等)。需要注意的是,这些用户是应用程序用户,而不是 AWS IAM 用户。

我创建了多个 AWS Cognito 用户组,而我在这些组中有多个用户。例如,admin 组的用户可以输入任何公开的 api。例如,营销人员只能列出一些东西,但他们无法访问 API 来创建。

我想知道如何使 Api Gateway 允许或拒绝某些应用程序用户的访问,但基于 AWS Cognito 用户池。

PS:我处理过这些组中的 IAM 角色,处理过联合身份,但我不知道我是否走在正确的道路上。

【问题讨论】:

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


    【解决方案1】:

    将 Cognito 用户池和组与 Cognito 身份池结合使用,以提供基于角色的细粒度访问控制。

    This AWS blog post 提供了有关如何使用 Cognito 用户池和 Cognito 身份池设置基于角色的细粒度访问控制的详细教程。它使用 DynamoDB 和 S3 作为示例,但您可以应用相同的委托人来控制对几乎所有 AWS 服务的访问。

    【讨论】:

    • 关于 Cognito 的联合身份我有一个问题。想法是应用程序用户登录并可以通过应用程序的前端保存用户,但想法不是他可以拥有临时凭证来直接访问亚马逊服务,并查看数据库表,不!这主要是我的困惑,Federal Identities 给了我临时凭证,但这样我就可以访问 Amazon 控制台?或者我可以使用它来验证用户是否可以使用 Api Gateway 端点,否则他会被拒绝。跨度>
    • 我需要的只是允许或拒绝应用程序用户通过前端可以进入 Api 网关端点。例如,允许该前端用户保存用户,但拒绝删除用户。所有这一切都无需直接进入 Amazon Web Services 控制台,因为他们只是应用程序用户。
    • 您获取凭据的方式不会授予控制台访问权限。在本教程中,您创建了一个允许或拒绝 API 网关访问的策略。此策略附加到 Cognito 组成员担任的角色。当用户登录到您的应用程序时,Cognito 将承担与其组返回访问凭据关联的角色; AccessKeyId、SecretAccessKey 和 SessionToken。然后应用程序应使用这些凭据访问 API 网关,然后根据假定的角色允许或拒绝用户访问。
    • 我按照你告诉我的方式做了,但是我遇到的问题是,例如,我在登录后从 Postman 访问 Api Gateway 端点(使用令牌 ID),它允许我进入终点。我在该用户所在的用户组的角色策略中拒绝了此端点。下面我将说明我是如何扮演这个角色的,所以请在下面的问题中查看。谢谢。
    【解决方案2】:

    第 1 步:在 AWS Cognito 中为您的用户池创建 OAuth 范围。 Cognito->用户池->应用集成->资源服务器。 https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-define-resource-servers.html

    步骤 2:在 AWS API Gateway 中,使用 Authorization 作为您的 AWS Cognito 用户池,并使用 OAuth Scopes 设置用户池有权访问的资源服务器。 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-enable-cognito-user-pool.html

    例如,您的管理员组可能有权访问所有资源服务器,但您的营销组可能具有受限访问权限。因此,如果您的营销组中的某个人向 API 网关发出请求,并且如果他没有访问特定资源服务器的权限,他们将收到 403 响应。希望这会有所帮助。

    【讨论】:

    • 当我在资源服务器上定义一个范围时,该范围是否适用于用户池中的所有用户,而不管每个用户的角色如何?例如,我如何定义 admin 用户组将有权访问所有资源,而营销组将没有更多的阅读资源?
    • @DanielZapata 你有办法解决吗?
    【解决方案3】:

    下面我展示了我如何在 cognito 中参数化所有内容:

    1. 我在 cognito 中有一组用户。
    2. 我有一个用户在代码中分配到该组。
    3. 组的作用如下,拒绝所有对api网关的访问:

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Deny",
                  "Action": [
                      "execute-api:Invoke"
                  ],
                  "Resource": "*"
              }
          ]
      }
      
    4. 我在 cognito 中创建了一个身份池,用于接收 Amazon Cógnito,我选择了“从令牌中选择角色”,然后选择了“拒绝”。

    但是,当我从邮递员登录并获取令牌的 id,然后使用从邮递员指向 Api 网关 URL 的所述数据进行访问时,返回该端点的所有数据,这是不正确的,因为我拒绝它访问。

    【讨论】:

    • 对资源使用arn:aws:execute-api:*:*:*。确保将此策略附加到用户所在的组。
    • @hephalump 输入您在策略中告诉我的内容,但它仍然允许我访问该用户,该用户不应进入 Api 网关。我已经尝试了更多的东西,我不知道我是否做错了什么,或者真的 cognito 没有验证输入的用户的角色。如果您希望我给您发送另一个屏幕截图或其他内容,请告诉我。谢谢。
    • Cognito 绝对支持这一点。我不确定问题出在哪里,但您肯定做错了什么……AWS 有专门针对此的教程,我们使用相同的策略来控制对我们 API 的访问,并且效果很好。
    • 我在api网关认知授权器中使用。我不知道 AWS_IAM 是否应该用作授权人。关于亚马逊文档,理解起来有点复杂。
    • 如果您在 API 网关上使用 Cognito 授权器,则使用 ID Token 作为授权标头。
    猜你喜欢
    • 2020-12-23
    • 2021-08-05
    • 1970-01-01
    • 2020-05-13
    • 2018-12-05
    • 2017-12-30
    • 2017-06-26
    • 2015-12-04
    • 2017-05-29
    相关资源
    最近更新 更多