建议:将 Amazon Cognito 与 AWS DynamoDB 集成
Suggestion: Integrating Amazon Cognito with AWS DynamoDB
我已经构建了一个与 Amazon Cognito 连接的应用程序来接收用户的登录和注册。目前,应用程序支持三种不同的订阅(免费、基本、高级)。如果用户登录基本订阅,我想给他们最少的 DynamoDB 访问权限,以下载 运行 应用程序服务所需的应用程序部分。
如何直接连接 DynamoDB 和 Cognito
我不确定,遵循这种情况的最佳方法是什么?
(请注意-这不是基于移动的应用程序,因此请勿建议使用 AWS Amplify 或相关服务)
当我第一次了解 Cognito 时,我做出了与您目前相同的假设。我知道用户池可以充当我的应用程序的用户目录,而身份池将神奇地解锁 所有 我的授权需求。我错了:)
冒着过度简化的风险,AWS Cognito 的存在是为了回答两个问题:
- 你是谁? (身份验证)
- 你能做什么? (授权)
Cognito 通过两种不同的产品解决了这些问题:用户池(身份验证)和身份池(授权)。
在较高层次上,用户池可让您处理用户注册、身份验证、帐户恢复,并支持使用第三方身份提供商(如 Facebook、Google 等)进行身份验证。听起来您可能有这部分内容想通了。
另一方面,Cognito Identity Pools 提供了一种授权用户使用各种 AWS 服务的方法。您可以将其视为分发 AWS 凭证的自动售货机。例如,如果您需要授予用户将文件上传到 S3 存储桶或调用 API 网关中的端点的权限,您可以使用身份池来实现。你甚至可以allow item-level access to DynamoDB based on an Amazon Cognito ID。但是,这可能无法按您预期的方式工作,因为您的应用程序用户可能没有直接连接到 DynamoDB。
在大多数 web/mobile 应用程序中,用户不会直接 连接到 DynamoDB。相反,他们正在与 web/mobile 应用程序交互,该应用程序通过 API 与您的应用程序后端通信。然后 API 将与 DynamoDB 通信。如果您的堆栈在 AWS 中,路径可能如下所示:
Client (web/mobile app) <-> API Gateway <-> Lambda <-> DynamoDB
在此架构中,您的用户将通过 Cognito 进行身份验证。 Cognito 然后会授权用户调用 API Gateway。 API Gateway 会执行您的 lambda,然后它会与 DynamoDB 交互。此示例中 DynamoDB 的“用户”是您的 Lambda,不是您的应用程序的用户。
最后一点很重要,所以我再重复一遍:除非您的用户直接连接到 DynamoDB(不推荐),否则他们不是操作的“用户”发电机数据库。因此,基于用户的 Cognito ID 限制 DynamoDB 访问不适合您。
那么,你能做什么?您的应用程序需要围绕您的用户对 DynamoDB 产生的影响提供业务逻辑。也许免费用户对特定分区具有只读访问权限,而高级用户可以修改同一分区。该逻辑必须由您直接处理。
我知道您说过您不是在寻找 Amplify 建议,因为您的应用程序不是基于移动设备的。但是,Amplify 提供并非特定于移动开发的 SDK。 Serverless 的人们做出了 fantastic tutorial on building a full-stack serverless web app, which includes a very readable chapter on serverless auth with Cognito。他们在 Web 应用程序中使用 Amplify 与 Cognito、S3 和 API Gateway 集成。如果这是您想要做的事情,我建议您检查一下。
我已经构建了一个与 Amazon Cognito 连接的应用程序来接收用户的登录和注册。目前,应用程序支持三种不同的订阅(免费、基本、高级)。如果用户登录基本订阅,我想给他们最少的 DynamoDB 访问权限,以下载 运行 应用程序服务所需的应用程序部分。
如何直接连接 DynamoDB 和 Cognito 我不确定,遵循这种情况的最佳方法是什么?
(请注意-这不是基于移动的应用程序,因此请勿建议使用 AWS Amplify 或相关服务)
当我第一次了解 Cognito 时,我做出了与您目前相同的假设。我知道用户池可以充当我的应用程序的用户目录,而身份池将神奇地解锁 所有 我的授权需求。我错了:)
冒着过度简化的风险,AWS Cognito 的存在是为了回答两个问题:
- 你是谁? (身份验证)
- 你能做什么? (授权)
Cognito 通过两种不同的产品解决了这些问题:用户池(身份验证)和身份池(授权)。
在较高层次上,用户池可让您处理用户注册、身份验证、帐户恢复,并支持使用第三方身份提供商(如 Facebook、Google 等)进行身份验证。听起来您可能有这部分内容想通了。
另一方面,Cognito Identity Pools 提供了一种授权用户使用各种 AWS 服务的方法。您可以将其视为分发 AWS 凭证的自动售货机。例如,如果您需要授予用户将文件上传到 S3 存储桶或调用 API 网关中的端点的权限,您可以使用身份池来实现。你甚至可以allow item-level access to DynamoDB based on an Amazon Cognito ID。但是,这可能无法按您预期的方式工作,因为您的应用程序用户可能没有直接连接到 DynamoDB。
在大多数 web/mobile 应用程序中,用户不会直接 连接到 DynamoDB。相反,他们正在与 web/mobile 应用程序交互,该应用程序通过 API 与您的应用程序后端通信。然后 API 将与 DynamoDB 通信。如果您的堆栈在 AWS 中,路径可能如下所示:
Client (web/mobile app) <-> API Gateway <-> Lambda <-> DynamoDB
在此架构中,您的用户将通过 Cognito 进行身份验证。 Cognito 然后会授权用户调用 API Gateway。 API Gateway 会执行您的 lambda,然后它会与 DynamoDB 交互。此示例中 DynamoDB 的“用户”是您的 Lambda,不是您的应用程序的用户。
最后一点很重要,所以我再重复一遍:除非您的用户直接连接到 DynamoDB(不推荐),否则他们不是操作的“用户”发电机数据库。因此,基于用户的 Cognito ID 限制 DynamoDB 访问不适合您。
那么,你能做什么?您的应用程序需要围绕您的用户对 DynamoDB 产生的影响提供业务逻辑。也许免费用户对特定分区具有只读访问权限,而高级用户可以修改同一分区。该逻辑必须由您直接处理。
我知道您说过您不是在寻找 Amplify 建议,因为您的应用程序不是基于移动设备的。但是,Amplify 提供并非特定于移动开发的 SDK。 Serverless 的人们做出了 fantastic tutorial on building a full-stack serverless web app, which includes a very readable chapter on serverless auth with Cognito。他们在 Web 应用程序中使用 Amplify 与 Cognito、S3 和 API Gateway 集成。如果这是您想要做的事情,我建议您检查一下。