【问题标题】:Suggestion: Integrating Amazon Cognito with AWS DynamoDB建议:将 Amazon Cognito 与 AWS DynamoDB 集成
【发布时间】:2021-04-25 14:12:08
【问题描述】:

我已经构建了一个与 Amazon Cognito 连接的应用程序来获取用户的登录和注册。目前,应用程序支持三种不同的订阅(免费、基本、高级)。如果用户登录基本订阅,我想让他们访问 DynamoDB 以下载运行应用程序服务所需的应用程序部分。

如何将 DynamoDB 与 Cognito 直接连接 我不确定,遵循这种情况的最佳方法是什么?

(请注意 - 这不是基于移动的应用程序,因此不要建议使用 AWS Amplify 或相关服务)

【问题讨论】:

  • “给他们最少的访问权限”是什么意思?难道不是您的应用程序与 DynamoDB 通信,而不是用户直接交互吗?在这种情况下,您的应用程序有责任确定用户可以访问哪些功能。
  • @JohnRotenstein,我相信这个问题可能会混淆 Cognito 的角色。这一点也曾经让我感到困惑。如您所知,可以根据用户的 cognito 身份 ID 限制 DynamoDB 访问。但是,这与将应用程序用户的访问权限限制为免费/基本/高级层不同。虽然区别可能很微妙,但在第一次使用 Cognito 时,这是一个可以理解的混淆区别。正如您所指出的,Moi 查询的功能类型需要发生在应用程序的业务逻辑中,而不是在 Cognito 中。

标签: amazon-web-services amazon-s3 aws-lambda amazon-dynamodb amazon-cognito


【解决方案1】:

当我第一次了解 Cognito 时,我做出了与您目前所做的相同的假设。我知道用户池可以充当我的应用程序的用户目录,而身份池会神奇地解锁所有我的授权需求。我错了:)

冒着过于简单化的风险,AWS Cognito 的存在是为了回答两个问题:

  • 你是谁? (认证)
  • 你能做什么? (授权)

Cognito 通过两种不同的产品解决了这些问题:用户池(身份验证)和身份池(授权)。

从高层次上讲,用户池可让您处理用户注册、身份验证、帐户恢复,并支持通过 Facebook、Google 等第三方身份提供商进行身份验证。听起来您可能已经弄清楚了这部分。

另一方面,Cognito 身份池提供了一种授权用户使用各种 AWS 服务的方法。您可以将其视为分发 AWS 凭证的自动售货机。例如,如果您需要授予用户访问权限以将文件上传到 S3 存储桶或调用 API Gateway 中的端点,您可以使用身份池来实现。你甚至可以allow item-level access to DynamoDB based on an Amazon Cognito ID。但是,这可能不会按您预期的方式工作,因为您的应用程序用户可能没有直接连接到 DynamoDB。

在大多数 Web/移动应用程序中,用户不会直接连接到 DynamoDB。相反,它们正在与通过 API 与应用程序后端通信的 Web/移动应用程序进行交互。然后,该 API 将与 DynamoDB 进行通信。如果您的堆栈位于 AWS 中,则路径可能如下所示:

Client (web/mobile app) <-> API Gateway <-> Lambda <-> DynamoDB

在此架构中,您的用户将通过 Cognito 进行身份验证。然后,Cognito 将授权用户调用 API 网关。 API Gateway 将执行您的 lambda,然后与 DynamoDB 交互。此示例中 DynamoDB 的“用户”是您的 Lambda,不是您的应用程序的用户。

最后一点很重要,所以我再重复一遍:除非您的用户直接连接到 DynamoDB(不推荐),否则他们不是在 DynamoDb 上操作的“用户”。因此,您不会选择根据用户的 Cognito ID 限制 DynamoDB 访问。

那么,你能做什么?您的应用程序需要提供有关您的用户可以对 DynamoDB 产生什么影响的业务逻辑。也许免费用户对特定分区具有只读访问权限,而高级用户可以修改同一个分区。该逻辑必须由您直接处理。

我知道您说过您不是在寻找 Amplify 建议,因为您的应用程序不是基于移动设备的。但是,Amplify 提供的 SDK 并非专门针对移动开发。 Serverless 的人们在构建全栈无服务器 Web 应用程序时提出了 fantastic tutorial,其中包括一个非常 readable chapter on serverless auth with Cognito。他们在 Web 应用程序中使用 Amplify 与 Cognito、S3 和 API Gateway 集成。如果这是您想要做的事情,我建议您检查一下。

【讨论】:

  • 感谢您抽出宝贵的时间来写这篇文章。我已经在 cognito 中使用该模式有一段时间了,不过这些链接很有趣。
  • 这是一个桌面应用程序。所以,我不确定事情是如何运作的。您能否建议一种在桌面应用程序中从服务器存储和上传文件的方法?
  • 如果您正在开发桌面应用程序,您仍将使用适用于您选择的编程语言的 AWS 开发工具包来访问 S3、Cognito 等。我在 github 上从过去的 Amazon Re 中找到了一个项目:发明会议,展示如何将 Cognito 与 Java 和 .Net 桌面应用程序集成 (github.com/aws-samples/aws-cognito-java-desktop-app)。 github存储库的自述文件中也有一个教程链接。
  • 我上面概述的一般方法仍然适用于桌面应用程序。您不会将 DynamoDB(或任何 AWS 资源)“连接”到 Cognito。相反,您使用 Cognito 获取可用于访问 AWS 资源的凭证。 @John Rotenstein 在他的评论中正确指出,您的应用程序将成为这些服务之间的集成点。
猜你喜欢
  • 2019-12-02
  • 2016-09-26
  • 2018-11-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2020-11-18
  • 2021-06-23
  • 1970-01-01
相关资源
最近更新 更多