Cognito 保存用户池中的更改不起作用

Posted

技术标签:

【中文标题】Cognito 保存用户池中的更改不起作用【英文标题】:Cognito save changes in user pool is not working 【发布时间】:2018-12-12 16:40:41 【问题描述】:

我们正在使用 cognito 用户池进行身份验证,并且我在 MFA 和验证 下启用了电子邮件验证,所以一段时间后我尝试通过取消选中电子邮件复选框来删除该验证,我总是收到错误消息您的角色仍在创建中。请稍候再试。我等了一周,问题仍然存在。我只需要取消选中电子邮件验证。提前谢谢你。

【问题讨论】:

【参考方案1】:

我遇到了 SMS 角色被意外删除的问题。它也可能从未被创建。在 MFA 部分的底部,您将看到一个能够命名角色的输入框,然后单击“创建角色”按钮。

如果您已经有一个灰色的角色名称。在 IAM 中寻找它。如果它不存在,您将需要重新创建它。不幸的是,没有办法在 IAM 中执行此操作并使其适用于 Cognito,因为它需要服务角色的路径前缀(service-role)。我尝试通过 CLI 重新创建,虽然它生成了匹配的角色,但它仍然不起作用。

所以最好的办法是创建一个新的(虚拟)池,并在那里创建与您看到该错误消息的另一个池使用的名称相匹配的 SMS 角色。

然后您需要更新角色以确保 ExternalId 匹配(它是一个 UUID)。找到此 UUID 的唯一方法是通过 CLI,因此您需要使用以下命令找到它:aws cognito-idp get-user-pool-mfa-config --user-pool-id=xxxx

它应该返回当前角色名称和ExternalId,这样您就可以返回到 IAM 并找到新 AWS 创建的 SMS 角色并更新它的策略 JSON 以包含正确的 UUID。

最后,摆脱您创建的虚拟池,因为它现在也会受到“您的角色仍在创建中”的影响。错误。

基本上,它只是卡住了,需要将它的配置指向正确的角色(使用它的 ExternalId),不幸的是,没有足够的仪表板控件来解决这个问题。在他们修复之前,您必须稍微修改一下。

【讨论】:

我不确定该外部 ID 从控制台放在哪里 @Žilvinas 转到该角色,在 Trust relationships 选项卡中单击 Edit trust relationship 并将现有的 sts:ExternalId 替换为您从 aws cli 获得的 @Žilvinas 我在不知何故失去了 SNS 角色后遇到了这个问题。不幸的是,现在一年后,在虚拟池中创建角色时,arn 中包含“:role/service-role/”,而不仅仅是“:role/”,这会导致错误仍然存​​在。考虑删除池并重新创建它,但我害怕这个想法。 几乎是通过“aws iam create-role”实现的,它允许名称和 arn 完美匹配。然后我填写了权限策略和信任关系,但还是一样。 :(【参考方案2】:

我知道这已经晚了,但也许其他人可能会从中受益。

以下可能是一个解决方案,具体取决于场景。

我以某种方式删除了用户池使用的 SNS 角色。当一个新的被创建时,它与运行时显示的不匹配:

$ aws cognito-idp get-user-pool-mfa-config --user-pool-id=us-west-2_xxxxxxxxx

    "SmsMfaConfiguration": 
        "SmsConfiguration": 
            "SnsCallerArn": "arn:aws:iam::123456789098:role/sns12345-dev",
            "ExternalId": "myproj02605eb4_role_external_id"
        
    ,
    "MfaConfiguration": "OFF"

新角色的 arn 如下:

arn:aws:iam:123456789098:role/sns23456-dev

以下命令允许我更新 snsRole 并且用户池停止显示血 Your roles are still being created. Please wait and try again 错误。

aws cognito-idp update-user-pool \
--user-pool-id us-west-2_xxxxxxxxx \ 
--sms-configuration \
SnsCallerArn=arn:aws:iam::123456789098:role/sns23456-dev,ExternalId=myproj02605eb4_role_external_id

【讨论】:

通过添加我自己的 SnsCallerArn 和 ExternalId 值,这对我有用。谢谢!【参考方案3】:

我也遇到了同样的问题。我试图向我的用户池添加一些触发器,但它一直说正在创建角色。我看了看AIM,这个角色似乎不存在。对我有用的是各种不同的答案。

    获取用户池的外部 ID。
aws cognito-idp get-user-pool-mfa-config --user-pool-id=XXXXX

    "SmsMfaConfiguration": 
        "SmsConfiguration": 
            "SnsCallerArn": "arn:aws:iam::XXXX",
            "ExternalId": "XXXX"
        
    ,
    "MfaConfiguration": "OFF"


    在 AIM for SNS 中创建一个新角色。

    创建后,点击“信任关系”,然后点击“编辑信任关系”并添加以下json(不要忘记替换您的外部id)


  "Version": "2012-10-17",
  "Statement": [
    
      "Sid": "",
      "Effect": "Allow",
      "Principal": 
        "Service": "cognito-idp.amazonaws.com"
      ,
      "Action": "sts:AssumeRole",
      "Condition": 
        "StringEquals": 
          "sts:ExternalId": "YOUR_EXTERNAL_ID_HERE"
        
      
    
  ]

    使用 CLI,使用新角色的 ARN 更新池的角色:
aws cognito-idp update-user-pool --user-pool-id YOUR_USER_POOL_ID --sms-configuration SnsCallerArn=ROLE_ARN_HERE,ExternalId=YOUR_EXTERNAL_ROLE_HERE

在此之后,我能够将更改保存到用户池。

【讨论】:

【参考方案4】:

如果其他人面临同样的问题,我的解决方法如下: 我去了 IAM 并删除了该角色,然后返回到 Cognito 并再次为 SMS MFA 创建了该角色(刷新页面后)并且它起作用了。

【讨论】:

这仅对已创建的启用 MFA 的用户池是不可能的

以上是关于Cognito 保存用户池中的更改不起作用的主要内容,如果未能解决你的问题,请参考以下文章

进程池中的 itertuples 不起作用

更改 Tomcat 数据源池中的目录

核心数据保存到数据库不起作用

当我尝试将用户上传的图像保存在视图中时,为啥 ImageField 中的 upload_to 根本不起作用

将字典保存到 iPhone 不起作用?

MS Access - 关闭表单而不保存设计更改,acSaveNo 不起作用