使用AWS Cognito中的AdminCreateUser创建具有自定义属性的用户

时间:2018-05-23 10:52:19

标签: amazon-web-services amazon-cognito

我正在尝试使用带有以下代码的adminCreateUser API在AWS Cognito中创建用户

var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();

var params = {
      UserPoolId: "us-east-1_302HlhnaC", /* required */
      Username : "test@yopmail.com",
      ForceAliasCreation: true,
      TemporaryPassword: 'test@yopmail.com',
      UserAttributes: [
        {
          Name: 'given_name', /* required */
          Value: 'test'
        },
        {
          Name: 'family_name', /* required */
          Value: 'kumar'
        },
        {
          Name: 'name', /* required */
          Value: 'test'
        },
        {
          Name: 'custom:dob', /* required */
          Value: '1990-07-25'
        },
        {
          Name: 'email', /* required */
          Value: 'test@yopmail.com',
        },
        {
          Name: 'email_verified', /* required */
          Value: 'true',
        }
        /* more items */
      ],

};


cognitoidentityserviceprovider.adminCreateUser(params, function(error, data) {
    console.log(error,data);
    res.send("test");
});

它总是抛出以下异常: InvalidParameterException:属性不符合架构:custom:dob:架构中不存在属性。

我做错了什么,如果是,请让我知道解决方案。

由于

3 个答案:

答案 0 :(得分:3)

您必须提前添加自定义属性。您可以通过访问用户池并单击Attributes链接来创建自定义属性。

答案 1 :(得分:2)

只需在这里添加我的案子即可。

在我的CloudFormation中,我有:

  Schema:
    - AttributeDataType: String
      Name: role
      DeveloperOnlyAttribute: true
      Mutable: true
      Required: false

在控制台中,它翻译为: enter image description here

在应用程序adminCreateUser调用中,我必须将其提供为dev:custom:role

  cognitoService.adminCreateUser({
    UserPoolId: config.cognitoUserPoolId,
    Username: email,
    UserAttributes: [{
      Name: 'dev:custom:role',
      Value: role,
    }]
  }).promise()

尝试一下即可解决。希望我知道这个文档在哪里。

答案 2 :(得分:0)

达西的答案是正确的。但是我想详细说明一下,因为答案主要集中在AWS Web控制台上。

另外一个答案也就是前缀“ dev:”,这可能是未记录的解决方法(因此没有文档),并且可能会在没有警告的情况下停止工作。

首先,必须在创建Userpool时创建自定义属性。

        CreateUserPoolRequest request = new CreateUserPoolRequest
        {
           ...

            Schema = new List<SchemaAttributeType>
            {
            new SchemaAttributeType
            {
                Name = "email",
                AttributeDataType = AttributeDataType.String,
                Required = true,
                Mutable = false
            },
            new SchemaAttributeType //custom attribute
            {
                Name = "blah",
                AttributeDataType = AttributeDataType.String,
                Mutable = false
            },

            ...
        };

然后在创建用户时可以对其进行设置。

        var request = new AdminCreateUserRequest
        {
             ...

            UserAttributes = new List<AttributeType>
            {
                new AttributeType
                {
                    Name = "email",
                    Value = "xyz@xyz.com"
                },
                new AttributeType //custom attribute
                {
                    Name = $"custom:blah",
                    Value = "value for blah"
                }
            }
        };

现在,仅以“ custom:”作为前缀即可。

还请注意,AWS继承了具有不一致的api的传统,即在创建用户池时不必前缀,在创建用户时也无需前缀。