從CSV檔案將使用者匯入使用者集區 - Amazon Cognito

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

從CSV檔案將使用者匯入使用者集區

當您擁有外部身分存放區,以及為新的本機使用者準備使用者集區的時間時,大量使用者從逗號分隔值 (CSV) 檔案匯入可以是遷移至 Amazon Cognito 使用者集區的低耗用、低成本選項。CSV 檔案匯入是下載和填入範本檔案的程序,然後在匯入任務中將檔案移交給您的使用者集區。您可以使用CSV匯入來快速建立測試使用者。您也可以以程式設計方式將檔案填入外部身分存放區的讀取API請求,接著將其詳細資訊和屬性剖析為檔案的寫入操作。

匯入程序會設定所有使用者屬性的值,只有 password (密碼) 除外。不支援匯入密碼,因為安全最佳實務要求不能以純文字提供密碼,而我們不支援匯入雜湊碼。這表示您的使用者必須在第一次登入時變更密碼。您的使用者在使用此方法匯入時處於 RESET_REQUIRED 狀態。

您可以使用 設定使用者的密碼 AdminSetUserPassword API 請求將 Permanent 參數設定為 true。CSV 匯入不會對使用者集區中的每月計費作用中使用者 (MAUs) 做出貢獻。不過,密碼重設操作會產生 MAUs。若要在匯入大量可能未立即啟用的使用者時管理成本,請設定您的應用程式,在使用者登入並收到RESET_REQUIRED挑戰時提示他們輸入新密碼。

注意

每個使用者的建立日期,都是該使用者匯入使用者集區中的時間。建立日期不是匯入的屬性之一。

建立使用者匯入任務的步驟
  1. 在 AWS Identity and Access Management (IAM) 主控台中建立 Amazon CloudWatch Logs 角色。

  2. 建立使用者匯入 .csv 檔案。

  3. 建立及執行使用者匯入任務。

  4. 上傳使用者匯入 .csv 檔案。

  5. 啟動及執行使用者匯入任務。

  6. 使用 CloudWatch 檢查事件日誌。

  7. 需要匯入的使用者重設密碼。

其他 資源

建立 CloudWatch 日誌IAM角色

如果您使用的是 Amazon Cognito CLI或 API,則需要建立 CloudWatch IAM角色。下列程序說明如何建立 Amazon Cognito 可用來將匯入任務的結果寫入 CloudWatch Logs IAM的角色。

注意

當您在 Amazon Cognito 主控台中建立匯入任務時,您可以同時建立IAM角色。當您選擇建立新的IAM角色 時,Amazon Cognito 會自動將適當的信任政策和IAM政策套用至角色。

為使用者集區匯入建立 CloudWatch 日誌IAM角色 (AWS CLI、API)
  1. 登入 AWS Management Console 並在 開啟IAM主控台https://console.aws.amazon.com/iam/

  2. 為 建立新IAM角色 AWS 服務。如需進一步說明,請參閱 AWS Identity and Access Management 使用者指南中的為 AWS 服務建立角色

    1. 當您為 Trusted entity type (信任的實體類型) 選取使用案例時,請選擇任何服務。Amazon Cognito 目前未列在服務使用案例中。

    2. Add permissions (新增許可) 畫面中,選擇 Create policy (建立政策),然後插入下列政策陳述式。Replace (取代) REGION 使用者集 AWS 區域 區的 ,例如 us-east-1。Replace (取代) ACCOUNT 您的 AWS 帳戶 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/*" ] } ] }
  3. 由於您在建立角色時並未選擇 Amazon Cognito 做為受信任的實體,您現在必須手動編輯角色的信任關係。從IAM主控台的導覽窗格中選擇角色,然後選擇您建立的新角色。

  4. 選擇信任關係標籤。

  5. 選擇編輯信任政策

  6. 將下列政策陳述式貼到 Edit trust policy (編輯信任政策) 中,取代任何現有的文字:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cognito-idp.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  7. 選擇更新政策

  8. 請注意角色 ARN。您將在ARN建立匯入工作時提供 。

建立使用者匯入CSV檔案

您必須先建立逗號分隔值 (CSV) 檔案,其中包含要匯入的使用者及其屬性,才能將現有使用者匯入您的使用者集區。從您的使用者集區中,您可以擷取含有反映使用者集區屬性結構描述之標頭的使用者匯入檔案。然後,您可以插入符合 格式化CSV檔案 中格式化需求的使用者資訊。

下載CSV檔案標頭 (主控台)

使用下列程序下載CSV標頭檔案。

若要下載CSV檔案標頭
  1. 前往 Amazon Cognito 主控台。系統可能會提示您輸入 AWS 憑證。

  2. 選擇 User Pools (使用者集區)。

  3. 從清單中選擇現有的使用者集區。

  4. 選擇 Users (使用者) 索引標籤。

  5. Import users (匯入使用者) 區段,選擇 Create an import job (建立匯入任務)。

  6. 上傳 CSV下,選取 template.csv 連結並下載CSV檔案。

下載CSV檔案標頭 (AWS 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_verifiedphone_number_verified

      • 每個使用者必須至少有其中一個自動驗證屬性為 true。自動驗證屬性是當新使用者加入您的使用者集區時,Amazon Cognito 自動傳送代碼的電子郵件地址或電話號碼。

      • 使用者集區必須至少有一個自動驗證的屬性,可以是 email_verifiedphone_number_verified。如果使用者集區沒有自動驗證屬性,匯入任務將不會啟動。

      • 如果使用者集區只有一個自動驗證屬性,則必須為每個使用者驗證該屬性。例如,如果使用者集區只有 phone_number 是自動驗證屬性,則每個使用者的 phone_number_verified 值必須為 true

      注意

      為了讓使用者能夠重設密碼,他們必須要有已驗證的電子郵件或電話號碼。Amazon Cognito 會將包含重設密碼碼的訊息傳送至CSV檔案中指定的電子郵件或電話號碼。如果訊息傳送到電話號碼,則會透過SMS訊息傳送。如需詳細資訊,請參閱註冊時驗證聯絡資訊

    • email (如果 email_verifiedtrue)

    • phone_number (如果 phone_number_verifiedtrue)

    • 在您建立使用者集區時標記為必要的任何屬性

  • 字串形式的屬性值不能用引號括住。

  • 如果屬性值包含逗號,您必須在逗號前面放置斜線 (\)。這是因為CSV檔案中的欄位以逗號分隔。

  • CSV 檔案內容的格式應該為 UTF-8,沒有位元組順序標記。

  • cognito:username 是必要欄位,並且在您的使用者集區中必須是唯一的。它可以是任何 Unicode 字串,但是不能包含空格或 Tab。

  • 如果存在出生日期值,則必須採用 格式 mm/dd/yyyy。 例如,這表示 1985 年 2 月 1 日的出生日期必須編碼為 02/01/1985

  • cognito:mfa_enabled 是必要欄位。如果您已將多因素身分驗證 (MFA) 設定為使用者集區中的必要條件,則此欄位必須是true所有使用者的 。如果您已MFA將 設定為關閉,則此欄位必須false適用於所有使用者。如果您已MFA設定為選用,此欄位可以是 truefalse,但不能為空白。

  • 列的長度上限為 16,000 個字元。

  • CSV 檔案大小上限為 100 MB。

  • 檔案中的列數 (使用者數) 上限為 500,000。此上限不包括標題列。

  • updated_at 欄位值應該是 epoch 時間 (以秒為單位),例如: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 主控台和 AWS Command Line Interface () 建立和執行使用者集區匯入任務AWS CLI。

從CSV檔案匯入使用者 (主控台)

下列程序說明如何從 CSV 檔案匯入使用者。

從CSV檔案匯入使用者 (主控台)
  1. 前往 Amazon Cognito 主控台。系統可能會提示您輸入 AWS 憑證。

  2. 選擇 User Pools (使用者集區)。

  3. 從清單中選擇現有的使用者集區。

  4. 選擇 Users (使用者) 索引標籤。

  5. Import users (匯入使用者) 區段,選擇 Create an import job (建立匯入任務)。

  6. Create import job (建立匯入任務) 頁面上,輸入 Job name (任務名稱)。

  7. 選擇建立新IAM角色或使用現有IAM角色

    1. 如果您選擇建立新的IAM角色 ,請輸入新角色的名稱。Amazon Cognito 會自動建立具有正確許可和信任關係的角色。建立匯入任務的IAM主體必須具有建立IAM角色的許可。

    2. 如果您選擇使用現有IAM角色 ,請從角色選取 下的IAM清單中選擇角色。此角色必須具有 建立 CloudWatch 日誌IAM角色 中所述的許可和信任政策。

  8. 選擇 Create job (建立任務) 以提交任務,但稍後再開始。選擇 Create and start job (建立並開始任務),以提交並立即開始任務。

  9. 如果您已建立任務但尚未開始,可以稍後再開始。在 Import users (匯入使用者) 下的 Users (使用者) 標籤中,選擇您的匯入任務,然後選取 Start (開始)。您也可以從 提交StartUserImportJobAPI請求 AWS SDK。

  10. Import users (匯入使用者) 下的 Users (使用者) 標籤中監控使用者匯入任務的進度。如果任務未成功,您可以選取 Status (狀態) 值。如需其他詳細資訊,請選取檢視 CloudWatch 日誌以取得更多詳細資訊,並檢閱 CloudWatch 日誌主控台中的任何問題。

匯入使用者 (AWS 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的檔案上傳至URL您從create-user-import-job命令回應中取得的預先簽章。

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 是您URL上傳CSV檔案的 。所以此 ROLE_ARN 是您建立角色時ARN收到的 CloudWatch Logs 角色。

列出您的使用者匯入任務

若要列出您的使用者匯入任務,請使用下列命令:

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 主控台中檢視匯入任務的結果。

檢視結果

下列步驟說明如何檢視使用者集區匯入結果。

檢視使用者集區匯入的結果
  1. 登入 AWS Management Console 並在 開啟 CloudWatch 主控台https://console.aws.amazon.com/cloudwatch/

  2. 選擇 Logs (日誌)。

  3. 選擇使用者集區匯入任務的日誌群組。日誌群組名稱的格式為 /aws/cognito/userpools/USER_POOL_ID/USER_POOL_NAME

  4. 選擇您剛才執行的使用者匯入任務的日誌。日誌名稱格式為 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 會在首次登入時提示他們設定新密碼。

需要匯入的使用者重設密碼
  1. 在您的應用程式中,使用隨機密碼透過 InitiateAuth 默默地登入目前使用者。

  2. Amazon Cognito 會在啟用 PreventUserExistenceErrors 時傳回 NotAuthorizedException。否則會傳回 PasswordResetRequiredException

  3. 您的應用程式發出ForgotPasswordAPI請求並重設使用者的密碼。

    1. 應用程式會在ForgotPasswordAPI請求中提交使用者名稱。

    2. Amazon Cognito 會將代碼傳送至已驗證的電子郵件或電話號碼。目的地取決於您在phone_number_verifiedCSV檔案中為 email_verified和 提供的值。對 ForgotPassword 請求的回應指示代碼的目的地。

      注意

      您的使用者集區必須經過設定,以驗證電子郵件或電話號碼。如需詳細資訊,請參閱註冊及確認使用者帳戶

    3. 您的應用程式會向使用者顯示一則訊息,以檢查代碼傳送的位置,並提示您的使用者輸入代碼和新密碼。

    4. 使用者在應用程式中輸入確認碼和新密碼。

    5. 應用程式會在ConfirmForgotPasswordAPI請求中提交程式碼和新密碼。

    6. 您的應用程式將使用者重新導向到登入步驟。