2016-07-07 32 views
2

如果我有一个Cognito用户池和一个Cognito身份池,并且有特定于应用程序的数据,那么在如何将这些数据结合在一起时,是否有任何事情被认为是最佳实践?如何使用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" ] 
} 

我可以看到加入的用户群,你可能引入其他境内流离失所者和那么这将失败的缺点。那么也许你会使用身份池的身份ID?

最后,这个问题让我想知道你可能存储在用户池用户(在用户池本身)中的'属性'点是什么?以上面使用的邮政地址示例为例,如果将这些地址存储在用户池中,那么您必须分别为其他IDP中的用户存储地址 - 重复工作并使软件复杂化。

谢谢!

回答

4

一种选择是使用Cognito用户池作为Cognito身份池的提供者,然后该身份池将为您提供访问Dynamo的凭据。

如果您使用多个提供程序,那么最有意义的方法是使用Cognito身份池的生成标识(身份标识)作为Dynamo中的键,因为用户只能使用某些公共提供者,而不是用户池。

一旦登录被链接,此身份标识是不变的,只有一个例外。如果两个身份验证身份合并到一个身份池中,则生成的身份ID可能是。由于Dynamo的工作方式如此,这意味着您必须捕获合并事件,然后从旧的密钥中获取Dynamo中存在的所有条目,删除它们,然后使用新密钥重新插入它们。这肯定不是最流畅的场景,我们将把它作为一个功能请求来使这个用例更容易一些。

针对用户存储数据并不是真正设计有Cognito联合身份(身份池)的唯一用户池。当用户池更像是一个独立的实体时,它确实是最有意义的,而不是你描述的用例。

+0

Cognito身份池的生成标识(身份标识)是否可以用作DynamoDB表中的主键?这是推荐的行为? – Domsware

+0

身份合并的情况下,经过身份验证的身份标识的*唯一*时间将会改变。如果身份a具有用户池身份验证并且身份b具有Facebook,则说您给身份a的用户池令牌和身份b的facebook身份标识 - 这将触发合并。由此产生的身份标识可以是a或b,它是随机的。 –

+1

所以,如果你可能会合并,它可能会改变,否则不会。如果您使用的是用户池,则子字段是该用户的唯一标识符,也可以使用。 –

相关问题