API 无法识别向 AWS Boto3 Cognito-idp 传递参数

Posted

技术标签:

【中文标题】API 无法识别向 AWS Boto3 Cognito-idp 传递参数【英文标题】:Passing arguments to AWS Boto3 Cognito-idp isn't recognized by the API 【发布时间】:2021-08-05 20:34:02 【问题描述】:

我正在尝试在我的 Cognito 用户池中创建一个新用户。我正在使用admin-create() 电话。

这是我的脚本:

#!/usr/bin/env python3
import boto3
import argparse

client = boto3.client('cognito-idp')
parser = argparse.ArgumentParser()

parser.add_argument('-username', dest='username')
parser.add_argument('-email', dest='email')
parser.add_argument('-phone_number', dest='phone_number')

args = parser.parse_args()

response = client.admin_create_user(
    UserPoolId='eu-central-aaaaaaa',
    Username=args.username,
    UserAttributes=[
        
            'Name': 'email',
            'Value': args.email,
            'Name': 'phone_number',
            'Value': args.phone_number,
        ,
    ],
    # TemporaryPassword='',
    ForceAliasCreation=False,
    MessageAction='RESEND',
    DesiredDeliveryMediums=[
        'EMAIL'
    ],
)

如您所见,MessageAction= 设置为 RESEND

我正在运行以下命令:cognito.py -username test -email test@test.com -phone_number +12345678

这是我得到的错误:

botocore.errorfactory.InvalidParameterException: An error occurred (InvalidParameterException) when calling the AdminCreateUser operation: No email provided but desired delivery medium was Email

如果我尝试为用户使用email_verifiedphone_number_verified 属性,可能会重现类似的错误。如果我将它们设置为 true,我会收到错误消息,告诉我无法验证电子邮件/电话,因为它没有提供。但正如你可以清楚地看到的那样。

我试图理解为什么我的论点没有得到认可。

奇怪的是,如果我将属性更改为MessageAction='SUPPRESS',并且如果我不添加验证电子邮件/电话属性,那么将使用我传递的用户名、电子邮件和电话创建用户。

因此仅作为示例,这里是工作代码:

#!/usr/bin/env python3
import boto3
import argparse

client = boto3.client('cognito-idp')
parser = argparse.ArgumentParser()

parser.add_argument('-username', dest='username')
parser.add_argument('-email', dest='email')
parser.add_argument('-phone_number', dest='phone_number')

args = parser.parse_args()

response = client.admin_create_user(
    UserPoolId='eu-central-aaaaaa',
    Username=args.username,
    UserAttributes=[
        
            'Name': 'email',
            'Value': args.email,
            'Name': 'phone_number',
            'Value': args.phone_number,
        ,
    ],
    # TemporaryPassword='',
    ForceAliasCreation=False,
    MessageAction='SUPPRESS',
    DesiredDeliveryMediums=[
        'EMAIL'
    ],
)

我可以再次运行命令并创建用户:

cognito.py -username test -email test@test.com -phone_number +12345678
[server]$ 

【问题讨论】:

【参考方案1】:

问题是您的 UserAttributes 数组中的每个用户属性都需要一个 dict。您只是用代码中的电话号码属性覆盖了电子邮件属性。


response = client.admin_create_user(
    UserPoolId='eu-central-1_pDui4EwA8',
    Username=args.username,
    UserAttributes=[
        
            'Name': 'email',
            'Value': args.email,
        ,
        
            'Name': 'phone_number',
            'Value': args.phone_number,
        ,
    ],
    # TemporaryPassword='',
    ForceAliasCreation=False,
    MessageAction='RESEND',
    DesiredDeliveryMediums=[
        'EMAIL'
    ],
)

【讨论】:

谢谢。它似乎几乎可以工作。当我使用RESEND 时出现错误,但当值为SUPPRESS 时它可以工作。这是我使用RESEND时的错误:botocore.errorfactory.UserNotFoundException: An error occurred (UserNotFoundException) when calling the AdminCreateUser operation: User does not exist. 哦,没错。如果用户尚不存在,您需要省略它或将其设置为抑制 我明白了,那么注册某人的替代方法是什么?我希望系统向新用户发送一封电子邮件以完成注册。 如果我没记错的话,省略它应该会发送电子邮件。 你是个天才安德鲁。谢谢,非常感谢:)

以上是关于API 无法识别向 AWS Boto3 Cognito-idp 传递参数的主要内容,如果未能解决你的问题,请参考以下文章

AWS Quicksight 创建仪表板 BOTO3 API 调用错误

使用 BOTO3 为 AWS Api Gateway 自动化 CORS

AWS 使用 boto3 自动缩放创建 EMR 无法正常工作

使用boto3 Python SDK返回AWS EC2可用性区域属性

boto3或aws cli是否具有从实例创建模板?

Boto3 AWS KMS 加密解密文件