本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
通过 CSV 文件将用户导入用户池中
如果您有外部身份存储,并且有时间为新的本地用户准备用户池,那么在迁移到 Amazon Cognito 用户池,选择从逗号分隔值(CSV)文件批量导入用户既省时省力,又可降低成本。CSV 文件导入是先下载和填入模板文件,然后在导入任务中将该文件移交给用户池的过程。您可以使用 CSV 导入来快速创建测试用户。您还可以通过编程的方式,使用读取 API 请求从外部身份存储中获取数据,然后解析这些数据的详细信息和属性,再将它们写入到文件中。
导入过程会设置所有用户属性的值,不过 password 除外。不支持导入密码,因为安全妥善做法要求密码不能为纯文本,而我们不支持导入哈希。这意味着,用户必须在首次登录时更改密码。使用此方法导入用户时,用户处于 RESET_REQUIRED 状态。
从 CSV 导入用户最省力的方法是在用户池中激活无密码登录。借助电子邮件地址和电话号码属性以及正确的用户池配置,用户可以在导入任务完成后立即使用电子邮件或短信一次性密码 (OTPs) 登录。有关更多信息,请参阅 要求导入的用户重置密码。
您还可以通过将Permanent参数设置为 AdminSetUserPasswordAPI 请求来设置用户的密码true。CSV 导入不会计入用户池中按月计费的活跃用户 (MAUs)。但是,确实会生成密码重置操作。 MAUs要在导入大量使用密码但可能无法立即激活的用户时管理成本,请将您的应用程序设置为在用户登录并接受RESET_REQUIRED质询时提示他们输入新密码。
注意
每个用户的创建日期就是将该用户导入用户池中的日期。创建日期不是导入的属性之一。
创建用户导入任务的步骤
- 
      在 Amazon Identity and Access Management (IAM) 控制台中创建 Amazon L CloudWatch ogs 角色。 
- 
      创建用户导入 .csv 文件。 
- 
      创建并运行用户导入任务。 
- 
      上传用户导入 .csv 文件。 
- 
      启动并运行用户导入任务。 
- 
      CloudWatch 用于查看事件日志。 
- 
      要求导入的用户重置密码。 
更多资源
- 
      Cognito 用户配置文件导出参考架构 ,用于在用户池之间导出用户账户 
主题
创建日 CloudWatch 志 IAM 角色
如果您使用的是 Amazon Cognito CLI 或 API,则需要创建一个 CloudWatch IAM 角色。以下过程介绍如何创建一个 IAM 角色,Amazon Cognito 可以使用该角色将导入任务的结果写入日志。 CloudWatch
注意
在 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/ - 。 
- 
        为创建新的 IAM 角色 Amazon Web Services 服务。有关详细说明,请参阅《Amazon Identity and Access Management 用户指南》中的为 Amazon Web Services 服务创建一个角色。 - 
            当您为 Trusted entity type(可信实体类型)选择 Use case(使用案例)时,请选择任意服务。Amazon Cognito 目前未在服务使用案例中列出。 
- 
            在 Add permissions(添加权限)屏幕中,选择 Create policy(创建策略)并插入以下策略声明。例如, REGIONAmazon Web Services 区域 替换为用户池中的us-east-1。例如ACCOUNT,用您的 Amazon Web Services 账户 身份证替换111122223333。
 
- 
            
- 
        由于您在创建角色时没有选择 Amazon Cognito 作为可信实体,因此您现在必须手动编辑该角色的信任关系。在 IAM 控制台的导航窗格中选择 Roles(角色),然后选择您创建的新角色。 
- 
        选择 Trust relationships(信任关系)选项卡。 
- 
        选择编辑信任策略。 
- 
        将以下策略声明粘贴到 Edit trust policy(编辑信任策略)中,替换任何现有文本: 
- 
        选择更新策略。 
- 
        记下 角色 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)
要获取正确标题的列表,请从 “导入用户” 下的 “用户” 菜单中选择 “创建导入任务”。在随后的对话框中,选择下载包含您的用户池属性的模板文件的template.csv链接。
您也可以运行以下 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 
- 
              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 字符串。但是,它不能包含空格或制表符。 
- 
          出生日期值(如果存在)必须采用以下格式 mm/dd/yyyy。也就是说,如果生日日期为 1985 年 2 月 1 日,则必须编码为02/01/1985。
- 
          cognito: mfa_enabled 字段必须符合用户池的 MFA 要求。如果您已在用户池中将多因素身份验证 (MFA) 设置为必填项,则对于所有用户,此字段 true必须为或为空。如果您已将 MFA 设置为关闭,则对于所有用户,此字段必须为false或为空。空值将导入的用户启用 MFA 的状态设置为用户池所需的状态。无论您是否设置了值,您都可以在没有有效的 MFA 因子的情况下将用户导入到必需 MFA 的用户池中。cognito:mfa_enabled处于此状态的用户已激活 MFA,但在配置电子邮件属性、电话号码属性或 TOTP 之前无法登录,并且该配置是用户池中有效的 MFA 因子。
- 
          最大长度为 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 志 IAM 角色 中所述的权限和信任策略。 
 
- 
            
- 
          在上传 CSV 下,选择选择文件并附加您准备的 CSV 文件。 
- 
        选择 Create job(创建作业)可提交作业,但稍后再启动。选择 Create and start job(创建并启动作业)可提交您的作业并立即启动。 
- 
        如果您创建了作业但未启动作业,则可以稍后再启动。在 “导入用户” 下的 “用户” 菜单中,选择您的导入任务,然后选择 “开始”。您也可以从 Amazon SDK 提交 StartUserImportJobAPI 请求。 
- 
        在 “导入用户” 下的 “用户” 菜单中监控用户导入任务的进度。如果您的作业不成功,则可以选择 Status(状态)值。要了解更多详细信息,请选择查看 CloudWatch 日志以了解更多详细信息,然后在 CloudWatch 日志控制台中查看所有问题。 
导入用户(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也是您在中收到的角色 ARN:创建日 CloudWatch 志 IAM 角色
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" 这一短语。此短语表示文件已成功上传。运行导入任务后,您的用户池不会将信息保留在导入文件中。它们完成或过期后,Amazon Cognito 会删除您上传的 CSV 文件。
描述用户导入任务
要获取用户导入任务的描述,请使用以下命令,其中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 文件上传到的网址。ROLE_ARN是您在创建角色时收到的 CloudWatch 日志角色 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。
- 
          用户数据与架构不匹配。 
- 
          由于内部错误,无法导入用户。 
在以下情况下,导入任务将失败:
- 
          无法担任 CloudWatch Amazon Logs 角色,该角色的访问策略不正确,或者已被删除。 
- 
          用户池已删除。 
- 
          Amazon Cognito 无法解析 .csv 文件。 
要求导入的用户重置密码
如果您的用户池仅提供基于密码的登录,则用户必须在导入密码后重置密码。他们第一次登录时可以输入任何密码。Amazon Cognito 会在 API 响应您的应用程序的登录请求时提示他们输入新密码。
如果您的用户池具有无密码身份验证因子,Amazon Cognito 会默认为导入用户的身份验证系数。他们不会被提示输入新密码,他们可以立即使用无密码电子邮件或 SMS OTP 登录。您还可以提示用户设置密码,以便他们可以完成其他登录方法,例如用户名密码和密钥。以下条件适用于用户导入后的无密码登录。
- 
        您必须导入具有与可用无密码登录系数相对应的属性的用户。如果用户可以使用电子邮件地址登录,则必须导入一个 email属性。如果是电话号码,则必须导入一个phone_number属性。如果两者兼而有之,则为任一属性导入一个值。
- 
        通常,用户在必须重置密码的 RESET_REQUIRED状态下进行导入。如果导入时能够使用无密码因素登录,则 Amazon Cognito 会将其状态设置为。CONFIRMED
有关无密码身份验证的更多信息,包括如何设置无密码身份验证以及如何在应用程序中构建身份验证流程,请参阅。使用 Amazon Cognito 用户池进行身份验证
以下过程描述了在导入 CSV 文件RESET_REQUIRED后,在自定义登录机制中使用本地用户的用户体验。如果您的用户使用托管登录方式登录,请他们选择 “忘记密码?” 选项,提供他们的电子邮件或短信中的代码,然后设置密码。
要求导入的用户重置密码
- 
        在您的应用程序中,通过 InitiateAuth使用随机密码以静默方式为当前用户尝试登录。
- 
        启用了 PreventUserExistenceErrors时,Amazon Cognito 返回NotAuthorizedException。否则返回PasswordResetRequiredException。
- 
        您的应用程序发出 ForgotPasswordAPI 请求并重置用户的密码。- 
            应用程序在 ForgotPasswordAPI 请求中提交用户名。
- 
            Amazon Cognito 向经过验证的电子邮件或电话发送代码。目标取决于您在 CSV 文件中为 email_verified和phone_number_verified提供的值。对ForgotPassword请求的响应指明了代码的目标。注意必须将您的用户群体配置为验证电子邮件或电话号码。有关更多信息,请参阅 注册并确认用户账户。 
- 
            您的应用程序向用户显示一条消息,以检查发送代码的位置,并提示用户输入代码和新密码。 
- 
            用户在应用程序中输入代码和新密码。 
- 
            应用程序在 ConfirmForgotPasswordAPI 请求中提交代码和新密码。
- 
            您的应用程序重定向用户以进行登录。 
 
-