如何将 AWS Cognito 用户池用户存储在数据库(例如 DynamoDB)中?

Posted

技术标签:

【中文标题】如何将 AWS Cognito 用户池用户存储在数据库(例如 DynamoDB)中?【英文标题】:How to store AWS Cognito User Pool users in DB (for instance DynamoDB)? 【发布时间】:2019-08-24 12:24:19 【问题描述】:

在我看来,“AWS Cognito”是“AWS 的 IdentityServer”。我做了一个 POC - 通过注册 API 调用创建用户。用户在 AWS Cognito 用户池中创建并返回访问令牌。但是,为了关联事物,我想在 DynamoDB 的用户表中创建用户,而不是在用户池中。

预期场景:

1) 新用户 --> 注册 --> AWS Cognito --> 在 DynamoDB 中添加新用户记录 --> AWS Cognito 返回访问令牌

2) 现有活动用户 --> 登录 --> AWS Cognito --> 从 DynamoDB 检索用户详细信息 --> AWS Cognito 返回访问令牌

Qn -1:类似于在 SQL Server 数据库表中创建 IdentityServer 用户。这可以在 AWS Cognito 中完成吗?是否可以绕过用户池并从数据库中获取用户数据?即使没有绕过,用户池是否可以从数据库表中映射其用户?

Qn - 2:用户池用户存储在哪里?最终在数据库中的某个地方?

注意:以下问题与我的相似,但尚未回答:

User sessions and storing aws cognito users in local DB

【问题讨论】:

【参考方案1】:

在您的方案中不能绕过用户池。但是,您可以将您的用户映射到 dynamoDB,甚至可以使用 custom policy 限制访问。要使用此策略,您必须构建 DynamoDB 表,使 Cognito 用户 ID 成为分区键。

只需在注册和登录后添加一个 lambda 触发器,即可将用户添加到 dynamoDB。添加除密码之外的任何内容,因为您可以使用 cognito 进行身份验证,然后通过 cognito ID 限制行访问。

至于您问题的第二部分,cognito 有自己的内部表。 AWS 没有具体说明他们使用什么,但由于自定义属性的灵活性,我猜测它是 NoSQL。

【讨论】:

谢谢,让我试试。我可以知道AWS最终将用户存储在用户池中的什么位置吗?在数据库中?我们可以在用户池本身(不在数据库中)存储额外的自定义用户信息,即 pin 码吗? Cognito 将用户存储在内部表中。 AWS 没有详细说明这一点,但它可能是一个 NoSQL 表。是的,您可以在用户池中添加自定义属性。当您打开用户池设置时,您可以在 aws 控制台的属性下找到此设置。 如果您需要经常检索这些数据或想以管理员身份执行一些分析,最好使用 dynamoDB。如果您只想在用户登录时存储和检索,那么您可以使用 cognito 池存储。 如果 lambda 失败,它会尝试三次。但这将是 dynamoDB 上的简单添加和检索操作,因此它不应该失败。稍微测试一下。 当然,让我试试。非常感谢:)

以上是关于如何将 AWS Cognito 用户池用户存储在数据库(例如 DynamoDB)中?的主要内容,如果未能解决你的问题,请参考以下文章

AWS + Serverless - 如何获取 cognito 用户池生成的密钥

如何在 AWS Cognito 用户池中为特定用户编辑用户属性?

AWS Cognito Design:如何使用多个用户池管理多个用户?

将 Cognito 中的用户信息与 AWS Amplify GraphQL 关联

如何使用 AWS Cognito 中的现有用户池生成 aws-exports.js?

如何使用 aws cloudformation 模板在 aws cognito 用户池中设置所需属性?