【问题标题】:Store data to DynamoDB with the Cognito userId使用 Cognito 用户 ID 将数据存储到 DynamoDB
【发布时间】:2018-11-02 21:23:34
【问题描述】:

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

我在 AWS DynamoDB 上创建了一个私有表,默认情况下分区键为 userId。据我所知,AWS DynamoDB 仅允许 userId 成为 identityId 来自例如AWSIdentityManager.

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

我使用identityId 读取/写入AWS DynamoDB,我通过AWSIdentityManager.default().identityId 得到userId

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

我如何从 AWSIdentityManager 获取特定于 AWS Cognito 用户的 identityId

【问题讨论】:

    标签: ios amazon-web-services amazon-dynamodb aws-sdk aws-cognito


    【解决方案1】:

    编辑:

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

    AWSCognitoIdentityProvider.Clear()
    

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

    结束编辑:

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

    您可以通过

    从 AWSCognitoIdentityUser 对象中获取用户名
    if let username = AWSCognitoIdentityUserPool.default().currentUser()?.username {
       // do stuff with username
    }
    

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

    【讨论】:

    • 非常感谢您的回复。我确实有一张需要userId 的私人餐桌。 userId 必须是 identityId 来自例如AWSIdentityManager,否则我不允许写或查询该项目。我如何才能托管一个私人桌子,例如用户名userId?
    • 其实看了AWSIdentityManager class referenece之后,我对identityId就不再那么确定了。您是说每个设备而不是每个用户的 id?
    • 我不完全理解您尝试使用的用例,但我确信用户名在 cognito 中是唯一的,并且在 dynamo 中分区键可以是任何类型。因此,因此,如果您希望使用 dyanmo 存储一些关于用户的额外元数据或唯一标识与特定用户关联的数据,那么使用用户名对我来说是有意义的,因为它保证是唯一的。
    • 是的。我在两个不同的设备上启动了同一用户的会话。两种设备都有不同的identityId
    • 太棒了!感谢您的链接。事实上,我的问题的根源是身份标识缓存。
    猜你喜欢
    • 2017-10-26
    • 2019-08-24
    • 2018-05-31
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 2017-12-28
    • 2018-08-23
    相关资源
    最近更新 更多