如果我有一个Cognito用户池和一个Cognito Identity Pool,并且我有特定于应用程序的数据,那么如何将这些数据连接在一起有什么最佳实践?
例如,假设我在DynamoDB中存储了应用程序数据,可能是用户发送的SMS /文本消息。还假设文本消息(存储在数据库中)如下所示:
{
"account_id": "a-uuid-for-the-account",
"message_body": "Hello world",
"message_subject": "Greetings!",
"date_sent": "...",
"message_id": "..."
}
然后我会将其加入用户池或身份池吗?例如,单独的帐户表可能包含类似这样的记录:
{
"account_id": "a-uuid-for-the-account",
"user_pool_username": "MrBloggs"
"addresses": [ "123 Springfield Road", "Blahsville" ]
}
我可以看到加入用户池的缺点,因为您可能会引入其他IDP,然后这会失败。那么,也许你会使用身份池'身份'的ID?
最后,这个问题让我想知道你可能存储在用户池用户(在用户池本身)中的“属性”是什么意思?以上面使用的邮政地址为例,如果将其存储在用户池中,则必须单独为其他IDP中的用户存储地址 - 重复工作并使软件复杂化。
谢谢!
答案 0 :(得分:4)
一种选择是使用Cognito用户池作为Cognito身份池的提供程序,然后为您提供访问Dynamo的凭据。
如果您正在使用多个提供商,那么可能最有意义的方法是使用Cognito身份池生成的ID(身份ID)作为Dynamo中的密钥,因为用户可能只使用某些公共提供程序登录,而不是用户池。
一旦登录链接,此身份ID就是常量,但有一个例外。如果两个经过身份验证的身份在身份池中合并,则生成的身份ID可以是。由于Dynamo按照它的方式工作,这意味着您必须捕获合并事件,然后从Dynamo中获取旧密钥的所有条目,删除它们,并使用新密钥重新插入它们。这无疑是最顺利的方案,我们将此作为一项功能请求,以使此用例更容易。
针对用户存储数据并非真正考虑到Cognito联合身份(身份池),只考虑用户池。当用户池更像是一个独立的实体时,它真的是最有意义的,而不是你所描述的用例。