如何使用Golang SDK在Amazon Cognito用户池中创建新用户?
解决Go SDK集成Amazon Cognito创建用户的问题
错误原因分析
SignUp接口报错:用户池不允许用户注册
这个接口是给用户自助注册用的,当你的用户池关闭了自助注册功能(控制台默认可能关闭,或手动设置过),调用该接口就会触发这个错误。你的需求是后端创建用户,因此应放弃使用SignUp,改用管理员创建用户的接口。AdminCreateUser接口报错:"user doesn't exist"
这个看似矛盾的错误,大概率是参数配置错误导致:- 传入的
Username不是用户邮箱(若用户池设置邮箱作为用户名属性) UserAttributes中未正确设置email属性,或email值与Username不一致email_verified属性值格式错误(必须是字符串"true",而非布尔值)- 用户池ID填写错误,请求发到了不存在的用户池
- 传入的
正确实现步骤
1. 确认用户池配置
- 进入Cognito用户池控制台,在属性设置中,将用户名属性设为
邮箱 - 确保用户池的邮件设置正常(已配置SES或使用Cognito默认邮件服务,能发送邀请邮件)
2. 正确调用AdminCreateUser接口
以下是符合需求的Go SDK代码示例:
package main import ( "context" "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider" "github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider/types" ) func createUser(client *cognitoidentityprovider.Client, userPoolID, email string) error { input := &cognitoidentityprovider.AdminCreateUserInput{ UserPoolId: aws.String(userPoolID), Username: aws.String(email), // 用户名必须是邮箱,与用户池配置一致 UserAttributes: []types.AttributeType{ { Name: aws.String("email"), Value: aws.String(email), }, { Name: aws.String("email_verified"), Value: aws.String("true"), // 必须是字符串"true",不能用布尔值 }, }, AutoGeneratePassword: aws.Bool(true), // 自动生成密码 // MessageAction默认是"RESEND",会自动发送邀请邮件,无需额外设置 } _, err := client.AdminCreateUser(context.TODO(), input) if err != nil { return fmt.Errorf("failed to create user: %w", err) } return nil }
3. 权限验证
确保SDK使用的IAM凭证拥有以下权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "cognito-idp:AdminCreateUser", "Resource": "arn:aws:cognito-idp:你的区域:你的账号ID:userpool/你的用户池ID" } ] }
额外注意事项
- 若需自定义邀请邮件内容,可在用户池的消息自定义中配置邮件模板
- 若仍报错,检查请求中的用户池ID、邮箱格式是否正确,确保无拼写错误
内容的提问来源于stack exchange,提问作者Shabd Saran
相关产品推荐
相关产品推荐

