【问题标题】:Exposing Cognito Protected AWSGateway APIs to clients向客户端公开受 Cognito 保护的 AWSGateway API
【发布时间】:2019-05-11 00:41:45
【问题描述】:

用例: 我们有一些 AWSGateway API,我们的客户可以使用它们在后端做一些事情。这些 API 受 Cognito 保护。目前,我们的客户通过使用 Cognito 移动 SDK 构建的 android 应用程序使用此 APIS。

现在我们正尝试将这些 API 公开给我们的客户,以便集成到他们的内部工作流程中。

我试图找到最好的方法来做到这一点。目前我无法找到有关如何执行此操作的任何资源。

我似乎是 AWS Cognito 的服务器端用户,但我认为这不是我们想要做的。

谢谢。

【问题讨论】:

  • 嗨 Tharun,请确认,对于集成到其内部工作流程中的客户,身份验证将如何进行,是登录窗口,他们将在其中输入用户名密码还是客户 ID 和密码,它将是服务到服务的通信吗?
  • 是的,它是服务到服务的通信

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


【解决方案1】:

我猜这将是服务到服务或(服务器到服务器)通信,因为使用的这个术语是 Oauth 标准是 client_credentials 授权类型。

请参考文档获取token 获取令牌后,您需要传递此令牌AuthorizationAPI Gateway Custom Header for AWS Cognito

【讨论】:

    【解决方案2】:

    为了正确回答您的问题,我们需要更多信息。

    • 能否将内部工作流配置为使用 REST 服务?
    • 内部工作流支持哪些身份验证流程?

    SDK 或没有 SDK

    您可以通过生成的 SDK 或您自己的代码访问 API Gateway 中的网络服务。 从 API Gateway 控制台生成 SDK 的说明位于 here

    使用身份验证调用 Web 服务可以通过 IAM、API 密钥、Cognito、自定义授权者四种方式完成。我将提到前三个。

    IAM

    • 第 1 步,在 IAM 中使用访问密钥和密钥创建用户。
    • 第 2 步也是设置角色以使用 IAM 访问 API。去 IAM,选择角色,创建角色,并授予它访问您的 API 网关功能。看起来像这样:

    IAM 政策示例:

    {
       "Version": "2012-10-17",
       "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::account-id:user/Alice",
                        "account-id"
                    ]
                },
                "Action": "execute-api:Invoke",
                "Resource": [
                    "arn:aws:execute-api:region:account-id:api-id/stage/GET/pets"
                ]
            }
        ]
    }
    

    将此角色分配给您创建的用户。策略示例可用here.。有关包括本地证书等的更多身份验证选项,请查看here

    • 第 3 步,使用 AWS 密钥和密钥 SDK 调用 API。

    API 密钥

    如果您向 API 添加密钥,移动应用程序将失败,因为它没有这些密钥。最好部署一个不同版本的 API,它可以包装现有的 API,可以提供特定于工作流的附加功能。要了解如何执行此操作,请关注此link

    API 密钥的优点是您可以限制对 API 网关功能的访问、随意删除密钥、回收它们等。

    Cognito - 联合用户

    您的移动用户实际上是使用federated users 进行身份验证的。但是,其中一个联合用户频道恰好是认知频道。您可以添加更多,OpenAuth、Google、Facebook、SAML 等,在这里您可以添加客户端使用的身份验证类型。然后,用户将使用他们的用户名和密码向客户端安全提供程序进行身份验证,然后这些凭据通过联合用户传递到 API,因此必须设置联合用户以使用与您的客户端相同的身份验证机制。见下文blog post

    对于这个解决方案,我们有多种选择。 1. 通过联合用户将用户凭据传递给 API,这假设用户界面调用 Web 服务,但正如您提到的那样,它是工作流,并且我假设用户不会像使用移动应用程序那样直接访问该服务。即服务被机器作为服务器上的后台进程调用。这意味着该解决方案将不起作用。选项 2. 是为客户端创建一个新用户。这与通过移动应用程序访问服务相同。为此,您需要在客户端上做一些额外的工作,因为您需要检索临时访问令牌。

    • 步骤 1. 使用 SDK,或自行编写 API 接口。
    • 第 2 步。在 Cognito 中生成一个用户供后端系统使用。
    • 步骤 3. 使用 cognito 用户获取访问令牌
    • 步骤 4. 使用访问令牌访问 API 中的 Web 服务 网关。

    建议的解决方案

    创建 API 的第二个版本作为移动 API 的包装器或扩展,并使用上述 API 密钥。为什么?

    1. 可以限制对 API 的访问
    2. 不同的版本意味着您可以扩展它并添加特定于工作流的附加功能
    3. 最容易实现,因为没有密钥交换,这样的更新 请求标头。

    编辑:我对解决方案 2 的建议不正确。 AWS 文档说following 要将 API 方法包含在使用计划中,您必须配置单个 API 方法以需要 API 密钥。对于用户身份验证和授权,请勿使用 API 密钥。使用 IAM 角色、Lambda 授权方或 Amazon Cognito 用户池。

    AWS 还说以下内容可用于controlled access

    • 资源策略让您可以创建基于资源的策略,以允许或拒绝从指定源 IP 访问您的 API 和方法 地址或 VPC 端点。
    • 标准 AWS IAM 角色和策略提供灵活且强大的访问控制,可应用于整个 API 或个人 方法。
    • 跨域资源共享 (CORS) 可让您控制 API 如何响应跨域资源请求。
    • Lambda 授权者 是使用不记名令牌身份验证以及控制对 API 方法的访问的 Lambda 函数 标题、路径、查询字符串、阶段描述的信息 变量或上下文变量请求参数。
    • Amazon Cognito 用户池可让您创建可自定义的身份验证和授权解决方案。
    • 客户端 SSL 证书可用于验证对后端系统的 HTTP 请求是否来自 API 网关。
    • 使用计划让您可以向客户提供 API 密钥,然后跟踪和限制每个 API 的 API 阶段和方法的使用 键。

    并非所有上述方法都用于授权,例如 CORS 实际上保护用户免受跨站点脚本的影响,并且如所示 API 密钥仅用于使用计划。资源策略只是通过限制对 IP 地址的访问来进一步保护 API,因此您唯一的选择实际上是选项 1 中描述的 IAM 角色,以及选项 3 中描述的联合用户或您自己的自定义 lambda 授权,如果您使用的是 Lambda,或者如果您使用的不是用 API Gateway 包装的 lambda,则您自己的授权人。

    【讨论】:

    • 嗨 Jason,关于使用密钥或 Cognito 选项 2,我的看法与您相同。但在阅读 API 密钥部分后,我认为 API 密钥仅用于限制而不是用于认证和授权。即使我们使用 API 密钥,我仍然需要实现 Cognitio 选项 2 来对用户进行身份验证。我错了吗?
    • 假设我们使用 Cognito 作为授权者,实现它的标准方式是什么。从 Cognito 获取令牌的实现是否应该包含在我们提供的 SDK 中,或者我们是否应该期望客户端开发人员在使用我们的 API Gateway 生成的 SDK 之前这样做?
    • 客户端将使用其 Cognito 用户名和密码执行密钥交换以获取临时令牌。然后他们使用这些令牌调用服务。
    • 这里是 .Net 的文档,但您可以在其他框架中找到相同的文档,一旦您拥有令牌,然后使用令牌调用 API Gateway REST 服务。 docs.aws.amazon.com/sdk-for-net/v3/developer-guide/…
    • 总之 - 使用 AWS 开发工具包对用户进行身份验证,传入池数据等,以及用户名和密码。这会给你一个带有令牌的 cognito 用户。见这里docs.aws.amazon.com/cognito/latest/developerguide/…。然后使用该信息创建生成的 SDK 客户端的实例。即临时密钥、密钥、令牌和区域
    【解决方案3】:

    您可以单独使用 API 令牌进行授权(除非最近已将其删除) 我已经在多个应用程序中使用它们。 Authentication 不建议这样做——但如果它们足以进行授权,则它是特定于应用程序的 它们已通过更安全的方法进行了补充,但代价是客户端和服务器都非常复杂。

    API 令牌的优点是发行者、客户端和服务器易于使用,因为它们不需要复杂的签名或协议——但它们的基本安全性不如它们可以重复使用并且通常不会很快过期。否则它们等同于不记名令牌。

    安全性非常依赖于上下文——请考虑以下问题: 你到底在保护什么(提供安全for)?安全漏洞的风险和成本是什么?实施和使用它的成本/努力是多少? 许多安全“漏洞”并不在于身份验证协议处理本身,而是在于如何“开箱即用”管理数据——没有安全是完美的,这意味着追求完美安全的成本是无限的,但效率会降低。通常,建议平衡潜在损失的风险和成本与实施和维护成本。 您可以拥有一个“高度安全”的 API,但由于在通过受保护网关之前和之后的处理,也有很高的破坏和数据丢失风险。在许多合理的情况下,不是专注于用银行金库和装甲卡车保护“前门”,而是保护数据处理,以使具有重大安全风险的数据不会通过前门。 AWS 提供了一系列技术特性——但最终取决于每个客户是否实施适合其使用的技术特性。 API 密钥确实有一系列适当的用例,特别是在服务器到服务器的通信中,尤其是在不涉及个人身份(和 PI 数据)的情况下,或者 API 主要涉及服务而不是数据的情况下(例如,图像缩略图 API不存储状态并且不提供对数据的访问)。在使用 HTTPS/SSL 和可能的其他安全因素(例如帐户密码、IP 范围白名单和最少访问权限的一般策略)支持时。
    不要低估“便签”因素。如果您让安全访问对您的用户来说太痛苦了,他们会找到一种方法来减轻痛苦,但安全性会比他们没有动机规避的更简单的措施更安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      相关资源
      最近更新 更多