通过 CSV 文件将用户导入用户池中
如果您有外部身份存储,并且有时间为新的本地用户准备用户池,那么在迁移到 Amazon Cognito 用户池,选择从逗号分隔值(CSV)文件批量导入用户既省时省力,又可降低成本。CSV 文件导入是先下载和填入模板文件,然后在导入任务中将该文件移交给用户池的过程。您可以使用 CSV 导入来快速创建测试用户。您还可以通过编程的方式,使用读取 API 请求从外部身份存储中获取数据,然后解析这些数据的详细信息和属性,再将它们写入到文件中。
导入过程会设置所有用户属性的值,不过 password 除外。不支持导入密码,因为安全妥善做法要求密码不能为纯文本,而我们不支持导入哈希。这意味着,用户必须在首次登录时更改密码。使用此方法导入用户时,用户处于 RESET_REQUIRED
状态。
您可以使用 AdminSetUserPassword API 请求,将 Permanent
参数设置为 true
来设置用户的密码。CSV 导入不会计入用户池中的计费月活跃用户(MAU)。但密码重置操作会生成 MAU。要在导入大量可能不会立即处于活动状态的用户时控制成本,请将您的应用程序设置为在用户登录并收到 RESET_REQUIRED
质询时提示他们输入新密码。
注意
每个用户的创建日期就是将该用户导入用户池中的日期。创建日期不是导入的属性之一。
创建用户导入任务的步骤
-
在 Amazon Identity and Access Management(IAM)控制台中创建 Amazon CloudWatch Logs 角色。
-
创建用户导入 .csv 文件。
-
创建并运行用户导入任务。
-
上传用户导入 .csv 文件。
-
启动并运行用户导入任务。
-
使用 CloudWatch 检查事件日志。
-
要求导入的用户重置密码。
更多资源
-
Cognito 用户配置文件导出参考架构
,用于在用户池之间导出用户账户
主题
创建 CloudWatch Logs IAM 角色
如果您使用的是 Amazon Cognito CLI 或 API,则需要创建一个 CloudWatch IAM 角色。以下过程描述了如何创建 IAM 角色,Amazon Cognito 可以使用该角色将导入作业的结果写入 CloudWatch Logs。
注意
在 Amazon Cognito 控制台中创建导入作业时,您可以同时创建 IAM 角色。当您选择 Create a new IAM role(创建新 IAM 角色)时,Amazon Cognito 会自动对该角色应用相应的信任策略和 IAM policy。
为用户群体导入创建 CloudWatch Logs IAM 角色(Amazon CLI、API)
登录 Amazon Web Services Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
为 Amazon Web Services 服务 创建新 IAM 角色。有关详细说明,请参阅《Amazon Identity and Access Management 用户指南》中的为 Amazon Web Services 服务 创建一个角色。
-
当您为 Trusted entity type(可信实体类型)选择 Use case(使用案例)时,请选择任意服务。Amazon Cognito 目前未在服务使用案例中列出。
-
在 Add permissions(添加权限)屏幕中,选择 Create policy(创建策略)并插入以下策略声明。将
REGION
替换为您用户群体的 Amazon Web Services 区域,例如us-east-1
。将ACCOUNT
替换为您的 Amazon Web Services 账户 ID,例如111122223333
。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:
REGION
:ACCOUNT
:log-group:/aws/cognito/*" ] } ] }
-
-
由于您在创建角色时没有选择 Amazon Cognito 作为可信实体,因此您现在必须手动编辑该角色的信任关系。在 IAM 控制台的导航窗格中选择 Roles(角色),然后选择您创建的新角色。
-
选择 Trust relationships(信任关系)选项卡。
-
选择编辑信任策略。
-
将以下策略声明粘贴到 Edit trust policy(编辑信任策略)中,替换任何现有文本:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cognito-idp.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
选择更新策略。
-
记下 角色 ARN。您在创建导入作业时需要此 ARN。
创建用户导入 CSV 文件
您必须先创建逗号分隔值(CSV,Comma-Separated Value)文件,在其中包含要导入的用户及其属性,然后才能将现有用户导入用户群体中。从用户群体中,您可以检索其标头反映了您的用户群体的属性架构的用户导入文件。然后,您可以插入符合 设置 CSV 文件的格式 中的格式要求的用户信息。
下载 CSV 文件标头(控制台)
使用以下步骤下载 CSV 标头文件。
下载 CSV 文件标头
-
转到 Amazon Cognito 控制台
。系统可能会提示您输入 Amazon 凭证。 -
选择 User Pools(用户池)。
-
从列表中选择现有用户池。
-
选择用户选项卡。
-
在 Import users(导入用户)部分中,选择 Create an import job(创建导入作业)。
-
在 Upload CSV(上传 CSV)下,选择 template.csv 链接并下载 CSV 文件。
下载 CSV 文件标头(Amazon CLI)
要获取一系列正确的标头,请运行以下 CLI 命令,其中,USER_POOL_ID
是要向其中导入用户的用户池的用户池标识符。
aws cognito-idp get-csv-header --user-pool-id "
USER_POOL_ID
"
示例响应:
{ "CSVHeader": [ "name", "given_name", "family_name", "middle_name", "nickname", "preferred_username", "profile", "picture", "website", "email", "email_verified", "gender", "birthdate", "zoneinfo", "locale", "phone_number", "phone_number_verified", "address", "updated_at", "cognito:mfa_enabled", "cognito:username" ], "UserPoolId": "
USER_POOL_ID
" }
设置 CSV 文件的格式
下载的用户导入 CSV 标头文件类似于以下字符串。它还包括您已添加到用户群体的所有自定义属性。
cognito:username,name,given_name,family_name,middle_name,nickname,preferred_username,profile,picture,website,email,email_verified,gender,birthdate,zoneinfo,locale,phone_number,phone_number_verified,address,updated_at,cognito:mfa_enabled
编辑 CSV 文件,以使文件包含此标头和用户的属性值,并根据以下规则设置格式:
注意
有关属性值(如电话号码的正确格式)的更多信息,请参阅使用用户属性。
-
文件的第一行是已下载的包含用户属性名称的标头行。
-
CSV 文件中列的顺序不重要。
-
第一行之后的每一行都包含用户的属性值。
-
标头中的所有列都必须存在,但您不需要在每一列中提供值。
-
以下属性为必需属性:
-
cognito:username
-
cognito:mfa_enabled
-
email_verified 或 phone_number_verified
-
每个用户至少有一个自动验证属性必须为
true
。自动验证的属性是新用户加入您的用户群体时,Amazon Cognito 自动向其发送验证码的电子邮件地址或电话号码。 -
用户池必须至少有一个自动验证属性,要么是 email_verified,要么是 phone_number_verified。如果用户池没有自动验证属性,则导入任务不会启动。
-
如果用户池只有一个自动验证属性,则该属性必须针对每个用户进行验证。例如,如果用户池只有 phone_number 为自动验证属性,则每个用户的 phone_number_verified 值都必须为
true
。
注意
对于重置其密码的用户,用户必须拥有经过验证的电子邮件或电话号码。Amazon Cognito 将包含重置密码代码的消息发送到 CSV 文件中指定的电子邮件或电话号码。如果将消息发送到电话号码,则通过 SMS 消息发送。有关更多信息,请参阅 在注册时验证联系人信息。
-
-
email(如果 email_verified 为
true
) -
phone_number(如果 phone_number_verified 为
true
) -
创建用户池时标记为必需的所有属性
-
-
字符串式的属性值不 应该用引号括起来。
-
如果属性值包含逗号,则您必须在逗号前使用反斜杠 (\)。这是因为 CSV 文件中的字段使用逗号分隔。
-
CSV 文件内容应采用不含字节顺序标记的 UTF-8 格式。
-
cognito:username 字段是必填项,并且在用户池中必须是唯一的。它可以是任何 Unicode 字符串。但是,它不能包含空格或制表符。
-
birthdate 值(如果存在)必须采用
mm/dd/yyyy
格式。也就是说,如果生日日期为 1985 年 2 月 1 日,则必须编码为02/01/1985
。 -
cognito:mfa_enabled 字段为必填字段。如果您已将用户池设置为需要进行多重验证 (MFA),则所有用户的此字段都必须为
true
。如果您已将 MFA 设置为关闭,则所有用户的此字段都必须为false
。如果您已将 MFA 设置为可选,则此字段可以是true
或false
,但不能为空。 -
最大长度为 16000 个字符。
-
CSV 文件的最大大小为 100MB。
-
文件中的最大行(用户)数为 500000。此最大值不包括标题行。
-
updated_at 字段值应为纪元时间(用秒表示),例如:
1471453471
。 -
属性值中的所有前导空格或尾部空格均应去除。
以下列表是没有自定义属性的用户群体的 CSV 导入文件示例。您的用户群体架构可能与此示例有所不同。在这种情况下,您必须在从用户群体下载的 CSV 模板中提供测试值。
cognito:username,name,given_name,family_name,middle_name,nickname,preferred_username,profile,picture,website,email,email_verified,gender,birthdate,zoneinfo,locale,phone_number,phone_number_verified,address,updated_at,cognito:mfa_enabled John,,John,Doe,,,,,,,johndoe@example.com,TRUE,,02/01/1985,,,+12345550100,TRUE,123 Any Street,,FALSE Jane,,Jane,Roe,,,,,,,janeroe@example.com,TRUE,,01/01/1985,,,+12345550199,TRUE,100 Main Street,,FALSE
创建并运行 Amazon Cognito 用户池导入任务
本部分介绍如何使用 Amazon Cognito 控制台和 Amazon Command Line Interface(Amazon CLI)创建并运行用户群体导入作业。
从 CSV 文件导入用户(控制台)
以下过程介绍了如何从 CSV 文件导入用户。
从 CSV 文件导入用户(控制台)
-
转到 Amazon Cognito 控制台
。系统可能会提示您输入 Amazon 凭证。 -
选择 User Pools(用户池)。
-
从列表中选择现有用户池。
-
选择用户选项卡。
-
在 Import users(导入用户)部分中,选择 Create an import job(创建导入作业)。
-
在 Create import job(创建导入作业)页面上,输入 Job name(作业名称)。
-
选择 Create a new IAM role(创建新的 IAM 角色)或者 Use an existing IAM role(使用现有 IAM 角色)。
-
如果您选择 Create a new IAM role(创建新的 IAM 角色),请输入新角色的名称。Amazon Cognito 将自动创建具有正确权限和信任关系的角色。创建导入作业的 IAM 主体必须具有创建 IAM 角色的权限。
-
如果您选择 Use an existing IAM role(使用现有 IAM 角色),请从 IAM role selection(IAM 角色选择)下的列表中选择一个角色。此角色必须具有 创建 CloudWatch Logs IAM 角色 中所述的权限和信任策略。
-
-
选择 Create job(创建作业)可提交作业,但稍后再启动。选择 Create and start job(创建并启动作业)可提交您的作业并立即启动。
-
如果您创建了作业但未启动作业,则可以稍后再启动。在 Users(用户)选项卡下的 Import users(导入用户)中,选择导入作业,然后选择 Start(开始)。您也可以从 Amazon SDK 提交 StartUserImportJob API 请求。
-
在 Users(用户)选项卡下的 Import users(导入用户)中,监控用户导入作业的进度。如果您的作业不成功,则可以选择 Status(状态)值。如需更多详细信息,请选择 View the CloudWatch logs for more details(查看 CloudWatch Logs 以获取详细信息),在 CloudWatch Logs 控制台中查看任意问题。
导入用户(Amazon CLI)
以下 CLI 命令可用于将用户导入到用户池:
-
create-user-import-job
-
get-csv-header
-
describe-user-import-job
-
list-user-import-jobs
-
start-user-import-job
-
stop-user-import-job
要获取这些命令的命令行选项列表,请使用 help
命令行选项。例如:
aws cognito-idp get-csv-header help
创建用户导入任务
创建 CSV 文件后,请通过运行以下 CLI 命令创建用户导入作业,其中,JOB_NAME
是您为作业选择的名称,USER_POOL_ID
是将新用户添加到的用户群体的用户群体 ID,ROLE_ARN
是您在 创建 CloudWatch Logs IAM 角色 中收到的角色 ARN:
aws cognito-idp create-user-import-job --job-name "
JOB_NAME
" --user-pool-id "USER_POOL_ID
" --cloud-watch-logs-role-arn "ROLE_ARN
"
响应中返回的 PRE_SIGNED_URL
在 15 分钟内有效。在此之后,它将过期,而您必须创建新的用户导入任务以获取新的 URL。
例 示例响应:
{ "UserImportJob": { "Status": "Created", "SkippedUsers": 0, "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "JobName": "JOB_NAME
", "JobId": "JOB_ID
", "PreSignedUrl": "PRE_SIGNED_URL
", "CloudWatchLogsRoleArn": "ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957431.965 } }
用户导入任务的状态值
在对用户导入命令的响应中,您将看到以下 Status
值当中的其中一个值:
-
Created
– 任务已创建但未启动。 -
Pending
– 转换状态。您已启动任务,但它尚未开始导入用户。 -
InProgress
– 任务已启动,正在导入用户。 -
Stopping
– 您已停止任务,但任务尚未停止导入用户。 -
Stopped
– 您已停止任务,且任务已停止导入用户。 -
Succeeded
– 任务已成功完成。 -
Failed
– 任务因错误而停止。 -
Expired
– 您创建了一个任务,但未在 24-48 小时内启动任务。与任务关联的所有数据已删除,且任务无法启动。
上传 CSV 文件
使用以下 curl
命令将包含用户数据的 CSV 文件上传到您从 create-user-import-job
命令的响应中获取的预签名 URL。
curl -v -T "
PATH_TO_CSV_FILE
" -H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL
"
在此命令的输出中,查找 "We are completely uploaded and
fine"
这一短语。此短语表示文件已成功上传。
描述用户导入任务
要获取用户导入任务的描述,请使用以下命令,其中,USER_POOL_ID
是用户池 ID,JOB_ID
是创建用户导入任务时返回的任务 ID。
aws cognito-idp describe-user-import-job --user-pool-id "
USER_POOL_ID
" --job-id "JOB_ID
"
例 示例响应:
{ "UserImportJob": { "Status": "Created", "SkippedUsers": 0, "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "JobName": "JOB_NAME
", "JobId": "JOB_ID
", "PreSignedUrl": "PRE_SIGNED_URL
", "CloudWatchLogsRoleArn":"ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957431.965 } }
在上一示例输出中,PRE_SIGNED_URL
是您上传 CSV 文件的目标 URL。ROLE_ARN
是您创建角色时收到的 CloudWatch Logs 角色 ARN。
列出用户导入任务
要列出用户导入任务,请使用以下命令:
aws cognito-idp list-user-import-jobs --user-pool-id "
USER_POOL_ID
" --max-results 2
例 示例响应:
{ "UserImportJobs": [ { "Status": "Created", "SkippedUsers": 0, "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "JobName": "JOB_NAME
", "JobId": "JOB_ID
", "PreSignedUrl":"PRE_SIGNED_URL
", "CloudWatchLogsRoleArn":"ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957431.965 }, { "CompletionDate": 1470954227.701, "StartDate": 1470954226.086, "Status": "Failed", "UserPoolId": "USER_POOL_ID
", "ImportedUsers": 0, "SkippedUsers": 0, "JobName": "JOB_NAME
", "CompletionMessage": "Too many users have failed or been skipped during the import.", "JobId": "JOB_ID
", "PreSignedUrl":"PRE_SIGNED_URL
", "CloudWatchLogsRoleArn":"ROLE_ARN
", "FailedUsers": 5, "CreationDate": 1470953929.313 } ], "PaginationToken": "PAGINATION_TOKEN
" }
任务按创建日期 (从近到远) 排列。第二项任务之后的 PAGINATION_TOKEN
字符串表示此列表命令还有其他结果。要列出更多结果,请使用 --pagination-token
选项,如下所示:
aws cognito-idp list-user-import-jobs --user-pool-id "
USER_POOL_ID
" --max-results 10 --pagination-token "PAGINATION_TOKEN
"
启动用户导入任务
要启动用户导入任务,请使用以下命令:
aws cognito-idp start-user-import-job --user-pool-id "
USER_POOL_ID
" --job-id "JOB_ID
"
每个账户每次只能有一个导入任务处于活动状态。
例 示例响应:
{ "UserImportJob": { "Status": "Pending", "StartDate": 1470957851.483, "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "SkippedUsers": 0, "JobName": "JOB_NAME
", "JobId": "JOB_ID
", "PreSignedUrl":"PRE_SIGNED_URL
", "CloudWatchLogsRoleArn": "ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957431.965 } }
停止用户导入任务
要停止正在进行的用户导入任务,请使用以下命令。停止任务后,无法重新启动该任务。
aws cognito-idp stop-user-import-job --user-pool-id "
USER_POOL_ID
" --job-id "JOB_ID
"
例 示例响应:
{ "UserImportJob": { "CompletionDate": 1470958050.571, "StartDate": 1470958047.797, "Status": "Stopped", "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "SkippedUsers": 0, "JobName": "JOB_NAME
", "CompletionMessage": "The Import Job was stopped by the developer.", "JobId": "JOB_ID
", "PreSignedUrl":"PRE_SIGNED_URL
", "CloudWatchLogsRoleArn": "ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957972.387 } }
在 CloudWatch 控制台中查看用户池导入结果
您可以在 Amazon CloudWatch 控制台中查看导入任务的结果。
查看结果
以下步骤介绍了如何查看用户池导入结果。
查看用户池导入结果的步骤
登录 Amazon Web Services Management Console 并打开 CloudWatch 控制台,网址为 https://console.aws.amazon.com/cloudwatch/
。 -
选择 Logs (日志)。
-
为用户池导入任务选择日志组。日志组名称的形式为
/aws/cognito/userpools/
。USER_POOL_ID
/USER_POOL_NAME
-
为刚运行的用户导入任务选择日志。日志名称的形式为
JOB_ID
/JOB_NAME
。日志中的结果按行号引用用户。日志中不会写入用户数据。对于每个用户,都将出现类似于以下内容的行:-
[SUCCEEDED] Line Number 5956 - The import succeeded.
-
[SKIPPED] Line Number 5956 - The user already exists.
-
[FAILED] Line Number 5956 - The User Record does not set any of the auto verified attributes to true. (Example: email_verified to true).
-
解析结果
已成功导入的用户的状态设置为“PasswordReset”。
在以下情况下,将不会导入用户,但导入任务将继续:
-
自动验证属性未设置为
true
。 -
用户数据与架构不匹配。
-
由于内部错误,无法导入用户。
在以下情况下,导入任务将失败:
-
Amazon CloudWatch Logs 角色无法被承担,因为没有正确的访问策略,或已删除。
-
用户池已删除。
-
Amazon Cognito 无法解析 .csv 文件。
要求导入的用户重置密码
每个导入的用户第一次登录并输入任意密码时,系统都会要求其输入新密码。以下过程描述了您导入 CSV 文件后,本地用户在自定义应用程序中的用户体验。如果您的用户使用托管 UI 登录,Amazon Cognito 会在其首次登录时提示他们设置新密码。
要求导入的用户重置密码
-
在您的应用程序中,通过
InitiateAuth
使用随机密码以静默方式为当前用户尝试登录。 -
启用了
PreventUserExistenceErrors
时,Amazon Cognito 返回NotAuthorizedException
。否则返回PasswordResetRequiredException
。 -
您的应用程序发出
ForgotPassword
API 请求并重置用户的密码。-
应用程序在
ForgotPassword
API 请求中提交用户名。 -
Amazon Cognito 向经过验证的电子邮件或电话发送代码。目标取决于您在 CSV 文件中为
email_verified
和phone_number_verified
提供的值。对ForgotPassword
请求的响应指明了代码的目标。注意
必须将您的用户群体配置为验证电子邮件或电话号码。有关更多信息,请参阅 注册并确认用户账户。
-
您的应用程序向用户显示一条消息,以检查发送代码的位置,并提示用户输入代码和新密码。
-
用户在应用程序中输入代码和新密码。
-
应用程序在
ConfirmForgotPassword
API 请求中提交代码和新密码。 -
您的应用程序重定向用户以进行登录。
-