Ios 使用Cognito用户标识将数据存储到DynamoDB

Ios 使用Cognito用户标识将数据存储到DynamoDB,ios,amazon-web-services,amazon-dynamodb,aws-sdk,aws-cognito,Ios,Amazon Web Services,Amazon Dynamodb,Aws Sdk,Aws Cognito,我使用AWS Mobile Hub设置iOS应用程序。我使用的服务是AWS Cognito和AWS DynamoDB 我在AWS DynamoDB上创建了一个私有表,默认情况下该表具有分区键userId。据我所知,AWS DynamoDB只允许用户ID成为标识ID,例如AWSIdentityManager 我能够通过AWSCognitoIdentityUserPool.default().currentUser()?.getSession()成功建立用户会话 我使用identitymanager

我使用AWS Mobile Hub设置iOS应用程序。我使用的服务是AWS Cognito和AWS DynamoDB

我在AWS DynamoDB上创建了一个私有表,默认情况下该表具有分区键
userId
。据我所知,AWS DynamoDB只允许
用户ID
成为
标识ID
,例如
AWSIdentityManager

我能够通过
AWSCognitoIdentityUserPool.default().currentUser()?.getSession()
成功建立用户会话

我使用
identitymanager.default().identityId
作为
userId
通过
AWSIdentityManager.default().identityId
读取/写入AWS DynamoDB

但是,
identityId
在设备上始终保持不变,即使我已经建立了用户会话

如何从AWS Cognito用户专用的
AWSideEntityManager
获取
identityId

正如我们在评论线程中一起发现的那样,每个cognito用户的IdentityId都是唯一的,但它们被缓存在设备上,需要在注销时清除。通过swift sdk清除:

AWSCognitoIdentityProvider.Clear()
下面是我的原始答案,建议使用用户名或别名,每个cognito用户的用户名或别名也是唯一的,但它只应作为评论讨论的参考。改用IdentityId作为dyanmodb主键

结束编辑:

我建议在dynamodb表中使用用户名作为分区键

您可以通过以下方式从AWSCognitoIdentityUser对象获取用户名:

if let username = AWSCognitoIdentityUserPool.default().currentUser()?.username {
   // do stuff with username
}

您还可以将用户池配置为使用自定义用户名别名,以允许用户通过电子邮件和/或电话号码登录。在这种情况下,电子邮件和/或电话号码也将是唯一的,如果您愿意,您可以使用它们中的任何一个作为dynamodb表中的唯一分区键。这是一份关于cognito的报告。

非常感谢您的回复。我确实有一个需要
用户ID
的私有表。
userId
必须是来自例如
AWSIdentityManager
identityId
,否则我不允许写入或查询该项目。然后,我如何承载一个私有表,例如,用户名为
userId
?实际上,在查看之后,我对identityId不再那么确定了。你是说它是每个设备的id,而不是每个用户的id?我不完全理解你想要使用的用例,但我确信用户名在cognito中是唯一的,在dynamo中,分区键可以是任何类型的。因此,如果您希望使用dyanmo来存储一些关于用户的额外元数据,或者唯一地标识与特定用户关联的数据,那么对我来说,使用用户名是有意义的,因为它保证是唯一的。是的。我在两个不同的设备上启动了同一用户的会话。两种设备都有不同的
标识ID
。太好了!谢谢你的链接。事实上,我的问题的根源是identityId缓存。