【问题标题】:How to Restrict Custom api access using AWS Cognito如何使用 AWS Cognito 限制自定义 api 访问
【发布时间】:2020-08-05 09:32:36
【问题描述】:

我在我的应用程序中使用 Spring Boot。在搜索一些 IAM 工具时,我其实很喜欢 Auth0,但我无法承受它们的价格。所以,我找到了另一个叫AWS Cognito

下面是Auth0来限制我们的自定义访问api

 https://auth0.com/docs/api-auth/restrict-access-api

目前,我正在尝试使用 AWS cognito 限制访问 API,但我没有找到正确的文档来实现这一点。谁能告诉我是否可以使用 aws cognito 限制 api 访问。

【问题讨论】:

  • 我不能 100% 确定您要达到的目标。您是否试图限制对您自己的自定义 API 的访问?您是要限制对所有 api 方法的访问,还是只限制对其中某个子集的访问。当您限制访问时,您是希望对所有用户都进行限制,还是希望不同的用户类型具有不同的访问级别?
  • @lemming 是的,试图限制对我自己的自定义 api 的访问,我们如何使用 aws cognito 来实现这一点?首先,是否可以使用 aws cognito 来限制自定义 api?

标签: amazon-web-services spring-boot aws-lambda aws-api-gateway amazon-cognito


【解决方案1】:

这取决于您希望对 api 的访问进行多少细粒度的控制。

允许或拒绝场景

在某些情况下,您要么想完全阻止某人,要么让他们访问您的所有 api。在这种全有或全无的情况下,最简单的方法是单独使用 Cognito 用户池来授权您的用户。 Cognito 用户池仅用于对用户进行身份验证(他们是谁),并提供工具以使注册和登录更容易。

如果用户通过了身份验证,那么您可以将 cognito 用户池返回的令牌之一(身份令牌)传递给 API 网关。只要您已将 api 方法设置为在 API 网关中拥有 Cognito 用户池授权方,那么这足以让他们接受身份令牌作为访问方法的授权。

细粒度访问

但是,在其他情况下,您需要更细粒度的控制。您可能希望所有经过身份验证的用户都可以访问您的 api 方法的某个子集,但只有管理员可以访问更多受限方法。

在这种情况下,您还需要使用 Cognito 身份池来定义用户角色(例如 UNAUTHENTICATED_USER、PAID_USER、ADMIN 等)及其关联的 IAM 角色 , 这将有政策允许他们访问或拒绝他们访问您的 api 的各个部分。

然后,您将 api 网关资源的授权方设置为 AWS_IAM(而不是上面全有或全无示例中的 Cognito 用户池)。 API Gateway 将使用从 Cognito 身份池中获取的角色凭据来确定当前用户的角色是否具有访问所请求资源的权限。

例如,您的 PAID_USER 用户角色可能会附加以下 IAM 角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "execute-api:Invoke",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:execute-api:*:*:fjfkdlsjflds/*"
      ]
    },
    {
      "Action": "execute-api:Invoke",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:execute-api:*:*:fjfkdlsjflds/*/admin/*"
      ]
    }
  ]
}

这使他们可以访问您的 api,除了您在 /admin/ 下设置的 api 方法(资源)。

我强烈推荐this AWS reinvent talk on Serverless Authentication and Authorization,它通过一些很好的例子来介绍这些选项。

【讨论】:

    【解决方案2】:

    据我了解,您要做的是解决 API 的授权问题。 Cognito 在身份验证的情况下出现(而不是您自己的数据库和用户处理它支持一切)。通过使用 Cognito,您可以创建用户池和身份池来处理用户身份验证,并为后续 API 调用的授权创建访问令牌。以下你需要做的 1) 注册 AWS Cognito 并创建用户管理池和身份池 2)创建一个spring boot应用程序(正如您在堆栈中提到的spring boot)以进行身份​​验证。 3)添加spring安全依赖 4)将appln注册为COgnito中的资源应用 5)进行身份验证并返回您生成的令牌。 6)创建另一个应用程序(对于实际业务您可能有多个微服务) 7) 在 cognito 中注册那些 spring boot 应用程序作为资源服务器 8)在新应用上添加spring安全依赖 9) 通过扩展 WebSecurityConfigAdaper 创建一个处理程序并覆盖配置 10) 通过扩展 OncePerRequestFilter 创建一个过滤器 11) 通过检查声明来验证令牌 12) 限制配置器的cofigure方法中所有调用的API访问

    【讨论】:

    • 您好,感谢您的简短回复。我听说我们可以使用 AWS API Gateway 服务进行授权,您知道吗...?我还没有通过这个,但必须..
    猜你喜欢
    • 2021-07-25
    • 2020-03-04
    • 2018-03-25
    • 1970-01-01
    • 2018-10-07
    • 2018-11-17
    • 2021-12-05
    • 2018-10-29
    • 2017-07-22
    相关资源
    最近更新 更多