首页 > 解决方案 > 如何在 AWS Cognito 中设置排序键(辅助键)?

问题描述

我正在使用 Cognito 用户池进行 iOS 应用用户注册。通常,在使用 Cognito 注册用户时,我使用电子邮件作为用户 ID。而且我正在收集其他信息,如电话号码、公司名称等。在这种情况下,当我尝试使用具有不同公司名称的相同电子邮件 ID 进行注册时,它会显示类似用户已存在的警报。

在我的新工作案例中,我想用不同的公司名称保存/注册相同的电子邮件。我怎样才能实现它?

例如,如果我们使用的是 DynamoDB 表,我们有 Partition 键和 Sort 键。通过使用这些我们将电子邮件设置为分区键,将企业名称设置为排序键,我们可以实现唯一性。

我们可以使用 Cognito 实现相同的功能吗?Cognito 是否支持分区键和排序键概念?有没有办法通过使用 Cognito 来实现这一点?请帮我解决这个问题。

标签: iosamazon-web-servicesamazon-cognito

解决方案


让我们从这个链接开始:

配置用户池属性

只要不需要,您就可以拥有可更改的标准属性。您也可以添加自定义属性,但它们是不可更改的。

好吧,让我们继续讨论一些项目的另一个案例,我需要将用户联合身份 ID(即 ap-northeast-1:3c2f5c30-0dc8-4d74-91a8-bf5c688abcde)存储到 cognito 用户池属性中。我应该将它存储在自定义属性中(即 custom:identity_id),因为它在未来永远不会改变。

回到您的案例,因为它将是动态值,用户可以更改他们的组织列表,以便您可以利用未使用的标准属性。例如,我将使用“zoneinfo”,尽管使用未关联的属性看起来很奇怪,因为没有名称为“organization”的属性。然而,一旦登录,至少用户可以从他们的令牌中提取他们的组织,如下所示:

"zoneinfo": "[org1, org2, org3, etc]"

但它不能完全适应您的情况,因为它应该在用户注册后存储。而如果你在需要注册时设置了“zoneinfo”,那么它必须是不可更改的。为了解决这个问题,您可以利用 cognito 用户池Post-Confirmation 触发器运行一些逻辑来初始化具有空组织列表的标准属性(即“zoneinfo”:“[]”)adminUpdateUserAttributes。这样用户就可以修改此属性,因为它不是必需的属性。

adminUpdateUserAttributes 示例:

async function updateOrgAttr() {
  try {
    var params = {
      UserAttributes: [ /* required */
        {
          Name: 'zoneinfo', /* required */
          Value: '[]'
        }
      ],
      UserPoolId: 'ap-northeast-1_xxxxxxxx', /* required */
      Username: event.userName /* event.userName is an item of post-confirmation trigger event source */
    };
    let cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();
    await cognitoidentityserviceprovider.adminUpdateUserAttributes(params).promise()
  } catch(e) {
    throw e
  }
}

推荐阅读