

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

# 管理使用者集區中的使用者
<a name="managing-users"></a>

在您建立使用者集區之後，您可以建立、確認和管理使用者帳戶。您可以使用 Amazon Cognito 使用者集區群組將 IAM 角色映射至群組，以管理您的使用者及其資源存取權限。

管理 Amazon Cognito 使用者集區中的使用者涉及各種組態選項和管理任務。使用者集區可以擴展到數百萬個使用者。此規模的使用者目錄需要同樣可擴展且可重複的管理工具。您可能想要建立許多使用者設定檔、管理非作用中的使用者、產生控管和合規報告，或設定使用者執行大部分工作的自助式工具。建立使用者集區後，您可以控制使用者註冊和確認其帳戶的方式，包括要求電子郵件或電話號碼驗證。管理員也可以直接建立使用者帳戶，並自訂歡迎訊息和密碼要求。

使用者集區具有使用者群組，您可以根據使用者的群組成員資格來管理對 資源的存取。您可以將 IAM 角色指派給這些群組， AWS 服務 以使用身分集區管理對 的存取。ID 和存取權杖中都存在使用者的群組成員資格。透過此資訊，您可以在應用程式中的執行時間或使用 Amazon Verified Permissions 等政策引擎進行存取控制決策。

使用者集區通常有許多使用者。您會經常發現自己正在搜尋和更新使用者帳戶。Amazon Cognito 主控台和 API 支援根據使用者名稱、電子郵件和電話號碼等標準屬性來查詢使用者。管理員也可以重設密碼、停用帳戶和檢視使用者事件歷史記錄。

若要遷移現有的使用者資料，Amazon Cognito 可以選擇從 CSV 檔案匯入使用者，並使用 [Lambda 觸發](user-pool-lambda-migrate-user.md)程序在使用者第一次登入時自動遷移使用者。這些選項支援使用者從其他使用者目錄轉換到您的使用者集區。

您可以使用使用者集區中的使用者管理功能，對使用者生命週期和身分驗證體驗進行精細控制。自助註冊、管理員建立的帳戶、群組和遷移工具的組合，使得 Amazon Cognito 使用者集區成為靈活的使用者目錄。

**Topics**
+ [設定建立使用者的原則](user-pool-settings-admin-create-user-policy.md)
+ [註冊及確認使用者帳戶](signing-up-users-in-your-app.md)
+ [建立使用者帳戶為管理員](how-to-create-user-accounts.md)
+ [新增群組至使用者集區](cognito-user-pools-user-groups.md)
+ [管理及搜尋使用者帳戶](how-to-manage-user-accounts.md)
+ [密碼、帳戶復原和密碼政策](managing-users-passwords.md)
+ [將使用者匯入使用者集區](cognito-user-pools-import-users.md)
+ [使用使用者屬性](user-pool-settings-attributes.md)

# 設定建立使用者的原則
<a name="user-pool-settings-admin-create-user-policy"></a>

您的使用者集區可以允許使用者註冊，或也可將其建立為管理員。您還可以控制註冊後的驗證和確認過程有多大程度掌握在用戶手中。例如，您可能想要根據外部驗證程序查看並接受註冊。此組態或管理員建立使用者政策，也定下了使用者將無法再確認自身帳戶前的時限。**

Amazon Cognito 可以滿足您大眾客戶的需求，做為軟體的客戶身分和存取管理 (CIAM) 平台。接受註冊且具有應用程式用戶端的使用者集區，無論是否有受管登入，都會為網際網路上知道您可公開探索之應用程式用戶端 ID 和註冊請求的使用者建立使用者設定檔。註冊的使用者設定檔可以接收存取和身份權杖，並可存取您授權給應用程式的資源。在使用者集區中啟用註冊之前，請先檢閱您的選項，並確保組態符合安全性標準。請謹慎設定**啟用自助註冊**與 `AllowAdminCreateUserOnly`，如下列流程所述。

------
#### [ AWS 管理主控台 ]

使用者集區的**註冊**功能表包含使用者集區中使用者註冊和管理建立的一些設定。

**若要設定註冊體驗**

1. 在 **Cognito 輔助驗證和確認**中，選擇是否**允許 Cognito 自動傳送訊息以進行驗證和確認**。啟用此設定後，Amazon Cognito 會傳送電子郵件或簡訊給新使用者，其中包含他們必須提供給您的使用者集區之代碼。這會確認他們的電子郵件地址或電話號碼所有權、將等效屬性設置為已驗證、並確認用戶帳戶以進行登入。您選擇的**待驗證屬性**會決定驗證訊息的傳遞方式和目的地。

1. **驗證屬性變更**在建立使用者時並不重要，但與屬性驗證相關。如使用者已變更但尚未驗證[登入屬性](user-pool-settings-attributes.md#user-pool-settings-aliases.title)，您可以允許其繼續使用新屬性值或原始屬性值登入。如需詳細資訊，請參閱[在使用者變更電子郵件或電話號碼時進行驗證](signing-up-users-in-your-app.md#verifying-when-users-change-their-email-or-phone-number)。

1. **必要屬性**顯示必須先提供值的屬性，才能讓使用者註冊或讓您建立使用者。您只能在建立使用者集區時設定必要的屬性。

1. **自訂屬性**對使用者建立和註冊程序很重要，因為您只能在第一次建立使用者時為*不可變*的自訂屬性設定值。如需自訂屬性的詳細資訊，請參閱 [自訂屬性](user-pool-settings-attributes.md#user-pool-settings-custom-attributes)。

1. 如果您希望使用者能夠使用[未驗證](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pools-API-operations.html#user-pool-apis-auth-unauth)的 `SignUp` API 產生新帳戶，請在**自助註冊**中選擇**啟用自助註冊**。如果停用自助註冊，就只能在 Amazon Cognito 主控台或使用 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html) 要求以管理員身份建立新使用者。在自我註冊處於非作用中狀態的使用者集區中，[SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) API 請求傳回`NotAuthorizedException`且受管登入不會顯示**註冊**連結。

對於您計劃以管理員身分建立使用者的使用者集區，您可以在**管理員設定的**臨時密碼下的**身分驗證方法**選單中的設定中，設定其臨時密碼的持續時間。

管理員建立用戶的另一個重要元素是邀請訊息。當您建立新使用者時，Amazon Cognito 會傳送訊息給他們，內含可讓他們進行首次登入的應用程式連結。在訊息範本下的**身分驗證方法**選單中自訂此訊息**範本**。

您可以使用用戶端機密來設定[機密應用程式用戶端](user-pool-settings-client-apps.md#user-pool-settings-client-app-client-types.title) (通常是 Web 應用程式)，防止在沒有應用程式用戶端機密的情況下註冊。作為安全性最佳實務，請勿在公有應用程式用戶端 (通常是行動應用程式) 中散佈應用程式用戶端機密。您可以在 Amazon Cognito 主控台的應用程式用戶端選單中建立具有用戶端秘密**的應用程式用戶端**。

------
#### [ Amazon Cognito user pools API ]

您可以透過程式設計方式設定參數，以便在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 要求中的使用者集區建立使用者。

[AdminCreateUserConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-AdminCreateUserConfig) 元素會為使用者集區的下列屬性設定值。

1. 啟用自助註冊

1. 您傳送給新管理員建立的使用者之邀請訊息

下列範例新增至完整 API 要求主體時，會設定具有未啟用自助註冊和基本邀請電子郵件的使用者集區。

```
"AdminCreateUserConfig": { 
      "AllowAdminCreateUserOnly": true,
      "InviteMessageTemplate": { 
         "EmailMessage": "Your username is {username} and temporary password is {####}.",
         "EmailSubject": "Welcome to ExampleApp",
         "SMSMessage": "Your username is {username} and temporary password is {####}."
      }
   }
```

[CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 要求的下列其他參數會管理新使用者的建立。

[AutoVerifiedAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-AutoVerifiedAttributes)  
您想要在註冊新使用者時[自動傳送訊息](user-pool-settings-email-phone-verification.md#user-pool-settings-email-phone-verification.title)的屬性、電子郵件或電話號碼。

[政策](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-Policies)  
使用者集區[密碼政策](managing-users-passwords.md#user-pool-settings-policies.title)。

[結構描述](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-Schema)  
使用者集區[自訂屬性](user-pool-settings-attributes.md#user-pool-settings-custom-attributes.title)。它們對使用者建立和註冊程序很重要，因為您只能在第一次建立使用者時為*不可變*的自訂屬性設定值。  
此參數也為使用者集區設定必要屬性。下列文字在插入完整 API 要求主體的 `Schema` 元素時，會視需要設定 `email` 屬性。  

```
{
            "Name": "email",
            "Required": true
}
```

------

# 註冊及確認使用者帳戶
<a name="signing-up-users-in-your-app"></a>

使用者帳戶會以下列其中一種方法新增到您的使用者集區：
+ 使用者在使用者集區的用戶端應用程式中註冊。這可能是行動和 Web 應用程式。
+ 您可以將使用者的帳戶匯入您的使用者集區中。如需詳細資訊，請參閱[從 CSV 檔案將使用者匯入使用者集區](cognito-user-pools-using-import-tool.md)。
+ 您可以在您的使用者集區中建立使用者的帳戶，並邀請使用者登入。如需詳細資訊，請參閱[建立使用者帳戶為管理員](how-to-create-user-accounts.md)。

自行註冊的使用者必須經過確認才能登入。匯入和建立的使用者已經過確認，但必須在第一次登入時建立自己的密碼。以下各節將說明確認程序，以及電子郵件和電話驗證。

**註冊時的密碼**  
Amazon Cognito 會在所有使用者註冊時要求他們提供密碼，但下列情況除外。如果符合*所有*這些條件，您可以在註冊操作中省略密碼。

1. [無密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)在您的使用者集區和應用程式用戶端中處於作用中狀態。

1. 您的應用程式是使用 AWS SDK 中的身分驗證模組自訂建置的。受管登入和託管 UI 一律需要密碼。

1. 使用者針對您允許的無密碼登入方法提供屬性值：電子郵件或簡訊一次性密碼 (OTPs)。例如，如果您允許使用電子郵件和電話 OTP 登入，使用者可以提供電話號碼或電子郵件地址，但如果您只允許使用電子郵件登入，則必須提供電子郵件地址。

1. 您的使用者集區[會自動驗證](#allowing-users-to-sign-up-and-confirm-themselves)使用者可以與無密碼登入搭配使用的屬性。

1. 對於任何指定的 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) 請求，使用者不提供[密碼](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-Password)參數的值。

## 使用者帳戶確認概觀
<a name="signup-confirmation-verification-overview"></a>

下圖說明確認程序：

![\[當使用者輸入確認碼時，會自動驗證電子郵件或電話。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/amazon-cognito-sign-in-confirm-user.png)


使用者帳戶可以是下列任何狀態：

**已註冊 (未確認)**  
使用者已成功註冊，但要等到使用者帳戶經過確認後才能登入。使用者已啟用，但未確認在此狀態。  
自行註冊的新使用者會從此狀態開始。

**已確認**  
已確認使用者帳戶，且使用者可以登入。當使用者輸入代碼或按照電子郵件連結確認其使用者帳戶時，會自動驗證該電子郵件或電話號碼。確認碼或連結的有效時間為 24 小時。  
如果管理員或註冊前 Lambda 觸發程序已確認過使用者帳戶，可能就不會有與帳戶相關聯的已驗證電子郵件或電話號碼。

**需要重設密碼**  
已確認使用者帳戶，但使用者必須請求確認碼，並重設其密碼，才能登入。  
由管理員或開發人員匯入的使用者帳戶會從此狀態開始。

**強制變更密碼**  
已確認使用者帳戶，而使用者可以使用臨時密碼登入，但在第一次登入時，使用者必須先將其密碼變更為新的值，才能進行任何其他操作。  
由管理員或開發人員建立的使用者帳戶會從此狀態開始。

**Disabled**  
您必須先停用該使用者的登入存取權限，才能刪除使用者帳戶。

**其他資源**
+ [使用 Amazon Cognito 偵測和修復非作用中使用者帳戶](https://aws.amazon.com/blogs/security/detecting-and-remediating-inactive-user-accounts-with-amazon-cognito/)

## 註冊時驗證聯絡資訊
<a name="allowing-users-to-sign-up-and-confirm-themselves"></a>

當新使用者註冊您的應用程式時，您可能希望其提供至少一種聯絡方式。例如，若您有了使用者的聯絡資訊，即可以：
+ 在使用者選擇重設其密碼時傳送臨時密碼。
+ 在使用者的個人資訊或財務資訊有所更新時通知使用者。
+ 傳送促銷訊息，例如特殊優惠或折扣。
+ 傳送帳戶摘要或帳單提醒。

對於以上所述的各種使用案例，您的訊息務必傳送至已驗證的目的地。否則，您的訊息將有可能因輸入錯誤而傳送至無效的電子郵件地址或電話號碼。或者更糟的是，您可能會將機密資訊傳送給假冒正當使用者的惡意人士。

為協助確保您的訊息只傳送給合宜的人士，請設定您的 Amazon Cognito 使用者集區，要求使用者註冊時必須提供以下項目：

1. 電子郵件地址或電話號碼。

1. 由 Amazon Cognito 傳送至該電子郵件地址或電話號碼的驗證碼。如果超過 24 小時，且您的使用者代碼或連結不再有效，請呼叫 [ResendConfirmationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html) API 操作以產生並傳送新代碼或連結。

透過提供驗證碼，使用者即證明其有權可存取收到該驗證碼的信箱或電話。使用者提供該代碼後，Amazon Cognito 將會更新您的使用者集區中相應使用者的資訊，方式如下：
+ 將使用者的狀態設為 `CONFIRMED`。
+ 更新使用者的屬性以表明驗證過其電子郵件地址或電話號碼。

若要檢視這項資訊，您可以使用 Amazon Cognito 主控台。或者，您可以使用 `AdminGetUser` API 操作、 `admin-get-user`命令搭配 AWS CLI，或其中一個 AWS SDKs中的對應動作。

如果使用者已驗證過聯絡方式，Amazon Cognito 將在使用者請求重設密碼時自動傳送訊息給該使用者。

### 確認和驗證使用者屬性的其他動作
<a name="allowing-users-to-sign-up-and-confirm-themselves-other-actions"></a>

下列使用者活動會驗證使用者屬性。您不需要將這些屬性設定為自動驗證：列出的動作在所有情況下都會將其標記為已驗證。

**電子郵件地址**  

1. 使用電子郵件一次性密碼 (OTP) 成功完成[無密碼身分驗證](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)。

1. 使用電子郵件 OTP 成功完成[多重要素驗證 (MFA)](user-pool-settings-mfa.md)。

**電話號碼**  

1. 使用 SMS OTP 成功完成[無密碼身分驗證](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)。

1. 使用 SMS OTP 成功完成 [MFA](user-pool-settings-mfa.md)。

### 設定您的使用者集區以要求進行電子郵件或電話驗證
<a name="verification-configure"></a>

當您驗證您的使用者電子郵件地址和電話號碼後，便可確保您能夠與您的使用者聯絡。請完成 中的下列步驟 AWS 管理主控台 ，以設定您的使用者集區，要求您的使用者確認其電子郵件地址或電話號碼。

**注意**  
如果您的帳戶中還沒有使用者集區，請參閱 [使用者集區入門](getting-started-user-pools.md)。

**設定使用者集區**

1. 導覽至 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

1. 從導覽窗格中，選擇 **Users Pools** (使用者集區)。從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**註冊**功能表，並找到**屬性驗證和使用者帳戶確認**。選擇**編輯**。

1. 在 **Cognito 輔助驗證和確認**中，選擇是否**允許 Cognito 自動傳送訊息以進行驗證和確認**。啟用此設定後，Amazon Cognito 會將訊息傳送至使用者聯絡屬性，該屬性是您在使用者註冊或建立設定檔時選擇的。為了驗證屬性並確認使用者設定檔以進行登入，Amazon Cognito 會將代碼或連結以訊息傳送給使用者。然後，使用者必須在您的 UI 中輸入代碼，以便應用程式在 `ConfirmSignUp` 或 `AdminConfirmSignUp` API 請求中確認。
**注意**  
您也可以停用 **Cognito-assisted verification and confirmation** (Cognito 協助驗證和確認)，並使用已進行身分驗證的 API 動作或 Lambda 觸發程序來驗證屬性並確認使用者。  
若您選擇此選項，Amazon Cognito 於使用者註冊時將不會傳送驗證碼。如果您要使用自訂身分驗證流程，驗證至少一種聯絡方式，而不使用由 Amazon Cognito 傳送的驗證碼，請選擇此選項。例如，您可以使用註冊前 Lambda 觸發器，自動驗證屬於特定網域的電子郵件地址。  
若您並未驗證使用者的聯絡資訊，使用者可能無法使用您的應用程式。請記住，使用者需要已驗證聯絡資訊，才能執行以下操作：  
**重設其密碼** – 當使用者在您的應用程式中選擇某個選項而呼叫了 `ForgotPassword` API 動作時，Amazon Cognito 會傳送臨時密碼至使用者的電子郵件地址或電話號碼。使用者需至少有一種已驗證的聯絡方式，Amazon Cognito 才會傳送此密碼。
**使用電子郵件地址或電話號碼作為別名登入** – 如果您將使用者集區設定成允許這類別名，則使用者必須驗證過其別名後才能使用別名登入。如需詳細資訊，請參閱[自訂登入屬性](user-pool-settings-attributes.md#user-pool-settings-aliases)。

1. 選擇 **Attributes to verify** (要驗證的屬性)：  
**傳送 SMS 訊息，驗證電話號碼**  
使用者註冊時，Amazon Cognito 將以 SMS 訊息傳送驗證碼。如果您通常透過 SMS 訊息與您的使用者通訊，則請選擇此選項。例如，假使您想傳送交貨通知、約會確認或提醒，就要使用已驗證的電話號碼。確認帳戶時，使用者電話號碼將成為已驗證的屬性；您必須採取額外的動作來驗證使用者電子郵件地址並與其通訊。  
**傳送電子郵件訊息，驗證電子郵件地址**  
使用者註冊時，Amazon Cognito 將透過電子郵件訊息傳送驗證碼。如果您通常透過電子郵件與您的使用者通訊，請選擇此選項。例如，假使您想傳送帳單、訂單摘要或特殊優惠，就要使用已驗證的電子郵件地址。確認帳戶時，使用者電子郵件地址將成為已驗證的屬性；您必須採取額外的動作來驗證使用者電話號碼並與其通訊。  
**如果電話號碼可用就會傳送 SMS 訊息，否則會傳送電子郵件訊息**  
若您不需要對所有使用者都用同一種已驗證的聯絡方式，請選擇此選項。在這種情況下，您的應用程式註冊頁面可能會要求使用者僅驗證其偏好的聯絡方式。Amazon Cognito 傳送驗證碼時，會將該代碼傳送至您的應用程式 `SignUp` 請求中提供的聯絡方式。如果使用者同時提供了電子郵件地址和電話號碼，而且您的應用程式也在 `SignUp` 請求中提供這兩種聯絡方式，則 Amazon Cognito 只會將驗證碼傳送至電話號碼。  
如果您要求使用者一併驗證電子郵件地址和電話號碼，請選擇此選項。Amazon Cognito 會在使用者註冊時驗證一種聯絡方式，而您的應用程式必須在使用者登入後驗證另一種聯絡方式。如需詳細資訊，請參閱[若您要求使用者一併確認電子郵件地址和電話號碼](#verification-email-plus-phone)。

1. 選擇 **Save changes (儲存變更)**。

### 身分驗證流程搭配電子郵件或電話驗證
<a name="verification-flow"></a>

如果您的使用者集區要求使用者驗證其聯絡資訊，您的應用程式即必須在使用者註冊時推行以下流程：

1. 使用者輸入使用者名稱、電話號碼和/或電子郵件地址，可能還有其他屬性，以註冊您的應用程式。

1. Amazon Cognito 服務從應用程式收到註冊請求。驗證請求中包含註冊必要的所有屬性之後，服務會完成註冊程序，並傳送確認碼到使用者的電話 (在簡訊中) 或電子郵件。此程式碼的有效期為 24 小時。

1. 服務向應用程式回報註冊完成，且使用者帳戶正在等待確認。回應中包含有關確認碼傳送到哪裡的資訊。此時使用者的帳戶處於未確認狀態，而使用者的電子郵件地址和電話號碼尚未驗證。

1. 應用程式現在可以提示使用者輸入確認碼。使用者不需要立即輸入確認碼。不過，使用者在輸入確認碼之前，將無法登入。

1. 使用者在應用程式中輸入確認碼。

1. 應用程式呼叫 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html) 將確認碼傳送到 Amazon Cognito 服務以供其驗證確認碼，如果確認碼正確，使用者的帳戶即會設為已確認狀態。成功確認使用者帳戶之後，Amazon Cognito 服務會自動將用來確認的屬性 (電子郵件地址或電話號碼) 標記為已驗證。除非此屬性的值變更，否則使用者不需要再驗證。

1. 此時使用者的帳戶處於已確認狀態，使用者可以進行登入。

### 若您要求使用者一併確認電子郵件地址和電話號碼
<a name="verification-email-plus-phone"></a>

Amazon Cognito 在使用者註冊時僅驗證一種聯絡方式。如果 Amazon Cognito 必須擇其一驗證電子郵件地址或是電話號碼，其將選擇驗證電話號碼，即透過簡訊傳送驗證碼。例如，假使您將使用者集區設定成允許使用者驗證電子郵件地址或電話號碼，而且您的應用程式在註冊時提供了這兩個屬性，Amazon Cognito 便只會驗證電話號碼。使用者已驗證其電話號碼後，Amazon Cognito 會將使用者的狀態設為 `CONFIRMED`，以允許使用者登入您的應用程式。

待使用者登入後，您的應用程式即可提供選項以驗證當初註冊時未驗證的聯絡方式。為了驗證第二種聯絡方式，您的應用程式將呼叫 `VerifyUserAttribute` API 動作。請注意，此動作需要 `AccessToken` 參數，而 Amazon Cognito 只會為已驗證的使用者提供存取權杖。因此，您要等到使用者登入後才能驗證第二種聯絡方式。

若您要求使用者一併驗證電子郵件地址和電話號碼，請執行以下步驟：

1. 設定您的使用者集區以允許使用者驗證電子郵件地址或電話號碼。

1. 在應用程式的註冊流程，要求使用者一併提供電子郵件地址和電話號碼。呼叫 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) API 動作並由 `UserAttributes` 參數提供電子郵件地址和電話號碼。此時，Amazon Cognito 會將驗證碼傳送到使用者的電話。

1. 由應用程式界面顯示確認頁面，以供使用者輸入驗證碼。呼叫 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html) API 動作以確認使用者。此時，使用者的狀態為 `CONFIRMED`，而且使用者的電話號碼已驗證，但仍未驗證其電子郵件地址。

1. 顯示登入頁面，並透過呼叫 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 動作進行使用者身分驗證。使用者通過身分驗證後，Amazon Cognito 會將存取權杖傳回您的應用程式。

1. 呼叫 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAttributeVerificationCode.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAttributeVerificationCode.html) API 動作。在請求中指定以下參數：
   + `AccessToken` – Amazon Cognito 在使用者登入時所傳回的存取權杖。
   + `AttributeName` – 指定 `"email"` 做為屬性值。

   Amazon Cognito 會將驗證碼傳送至使用者的電子郵件地址。

1. 顯示確認頁面以供使用者輸入驗證碼。當使用者提交驗證碼時，呼叫 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html) API 動作。在請求中指定以下參數：
   + `AccessToken` – Amazon Cognito 在使用者登入時所傳回的存取權杖。
   + `AttributeName` – 指定 `"email"` 做為屬性值。
   + `Code` – 使用者所提供的驗證碼。

   此時，電子郵件地址即已驗證。

## 允許使用者註冊您的應用程式，但以使用者集區管理員身分確認使用者
<a name="signing-up-users-in-your-app-and-confirming-them-as-admin"></a>

您可能不希望使用者集區在您的使用者集區中自動傳送驗證訊息，但仍想要允許任何人註冊帳戶。例如，該模式為人工審查新的註冊請求，以及批次驗證和處理請求保留空間。您可以在 Amazon Cognito 主控台中或使用 IAM 驗證 API 操作 [AdminConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminConfirmSignUp.html) 來確認新的使用者帳戶。無論您的使用者集區是否傳送驗證訊息，您都可以以管理員身分確認使用者帳戶。

您只能將此技術用於確認使用者自助式註冊。若要以系統管理員身分確認建立的使用者，請使用 `Permanent` 將 [AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) 請求設定為 `True`。

1. 使用者輸入使用者名稱、電話號碼和/或電子郵件地址，可能還有其他屬性，以註冊您的應用程式。

1. Amazon Cognito 服務從應用程式收到註冊請求。驗證請求中包含註冊必要的所有屬性之後，服務會完成註冊程序，並且向應用程式回報註冊完成，正在等待確認。此時使用者的帳戶處於未確認狀態。必須在確認帳戶之後，使用者才能登入。

1. 確認使用者的帳戶。您必須登入 AWS 管理主控台 或使用 AWS 登入資料登入您的 API 請求，以確認帳戶。

   1. 若要在 Amazon Cognito 主控台中確認使用者，請導覽至**使用者**功能表，選擇您要確認的使用者，然後從**動作**功能表中選擇**確認**。

   1. 若要在 AWS API 或 CLI 中確認使用者，請在 中建立 [AdminConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminConfirmSignUp.html) API 請求或 [admin-confirm-sign-up](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-confirm-sign-up.html) AWS CLI。

1. 此時使用者的帳戶處於已確認狀態，使用者可以進行登入。

## 運算私密雜湊值
<a name="cognito-user-pools-computing-secret-hash"></a>

最佳實務是將用戶端秘密指派給機密應用程式用戶端。將用戶端秘密指派給應用程式用戶端時，Amazon Cognito 使用者集區 API 請求必須包含在請求內文中包含用戶端秘密的雜湊。要驗證您對以下清單中 API 操作的用戶端秘密的了解，請將用戶端秘密與您的應用程式用戶端 ID 和使用者的使用者名稱串接起來，然後對該字串進行 base64 編碼。

當您的應用程式將使用者登錄到具有私密雜湊的用戶端時，您可用任何使用者集區登錄屬性的值作為私密雜湊的用戶名元素。當您的應用程式用 `REFRESH_TOKEN_AUTH` 在身份驗證操作中請求新權杖時，用戶名元素的值取決於您的登錄屬性。如果您的使用者集區沒有 `username` 作為登錄屬性，請從使用者之存取或 ID 權杖 `sub` 宣告中設定私密雜湊用戶名的值。如果 `username` 是登入屬性，請從 `username` 宣告中設定私密雜湊用戶名的值。

下列 Amazon Cognito 使用者集區 API 接受 `SecretHash` 參數中的用戶端秘密雜湊值。
+ [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html)
+ [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html)
+ [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html)
+ [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html)
+ [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html)

此外，下列 API 會在身分驗證參數或挑戰回應中接受 `SECRET_HASH` 參數中的用戶端秘密雜湊值。


| API 操作 | SECRET\$1HASH 的原生參數 | 
| --- |--- |
| InitiateAuth | AuthParameters | 
| AdminInitiateAuth | AuthParameters | 
| RespondToAuthChallenge | ChallengeResponses | 
| AdminRespondToAuthChallenge | ChallengeResponses | 

私密雜湊值是一種 Base 64 編碼的金鑰式雜湊訊息驗證碼 (HMAC)，利用使用者集區用戶端的私密金鑰和使用者名稱，加上訊息中的用戶端 ID 計算而成。下列虛擬程式碼顯示這個值是如何計算出來的。在這個虛擬程式碼中，`+`代表串聯，`HMAC_SHA256` 代表使用 HmacSHA256 來產生 HMAC 值的函數，而 `Base64` 代表產生 Base-64 編碼版雜湊輸出的函數。

```
Base64 ( HMAC_SHA256 ( "Client Secret Key", "Username" + "Client Id" ) )
```

如需如何計算和使用 `SecretHash` 參數的詳細概觀，請參閱 AWS 知識中心的[「無法驗證用戶端 <client-id>」錯誤的秘密雜湊 Amazon Cognito ？](https://aws.amazon.com/premiumsupport/knowledge-center/cognito-unable-to-verify-secret-hash/)。

您可以在伺服器端應用程式碼中使用下列程式碼範例：

------
#### [ Shell ]

```
echo -n "[username][app client ID]" | openssl dgst -sha256 -hmac [app client secret] -binary | openssl enc -base64
```

------
#### [ Java ]

```
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
 
public static String calculateSecretHash(String userPoolClientId, String userPoolClientSecret, String userName) {
    final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
    
    SecretKeySpec signingKey = new SecretKeySpec(
            userPoolClientSecret.getBytes(StandardCharsets.UTF_8),
            HMAC_SHA256_ALGORITHM);
    try {
        Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
        mac.init(signingKey);
        mac.update(userName.getBytes(StandardCharsets.UTF_8));
        byte[] rawHmac = mac.doFinal(userPoolClientId.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(rawHmac);
    } catch (Exception e) {
        throw new RuntimeException("Error while calculating ");
    }
}
```

------
#### [ Python ]

```
import sys
import hmac, hashlib, base64 
username = sys.argv[1] 
app_client_id = sys.argv[2] 
key = sys.argv[3] 
message = bytes(sys.argv[1]+sys.argv[2],'utf-8') 
key = bytes(sys.argv[3],'utf-8') 
secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode() 
print("SECRET HASH:",secret_hash)
```

------

## 確認使用者帳戶，而不驗證電子郵件或電話號碼
<a name="confirming-user-without-verification-of-email-or-phone-number"></a>

預先註冊 Lambda 觸發程序可以用來在註冊時自動確認使用者帳戶，而不需要確認碼或驗證電子郵件或電話號碼。以這種方式確認的使用者可以立即登入，而不需要接收確認碼。

您也可以透過這個觸發器，將使用者的電子郵件或電話號碼標記為已驗證。

**注意**  
雖然這個方法很方便讓使用者入門，但建議您至少要自動驗證電子郵件或電話號碼其中一項。否則，如果使用者忘記密碼，將會無法復原。

如果您不需要使用者在註冊時接收並輸入確認碼，而且您不在預先註冊 Lambda 觸發程序中自動驗證電子郵件和電話號碼，您就沒有該使用者帳戶的已驗證電子郵件地址或電話號碼，這會是個風險。使用者可以之後再驗證電子郵件地址或電話號碼。不過，如果使用者忘記密碼，而且沒有已驗證的電子郵件地址或電話號碼，使用者就無法進入帳戶，因為忘記密碼流程需要已驗證的電子郵件或電話號碼，才能傳送驗證碼給使用者。

## 在使用者變更電子郵件或電話號碼時進行驗證
<a name="verifying-when-users-change-their-email-or-phone-number"></a>

在您以多個登入名稱設定的使用者集區中，使用者可以在登入時輸入電話號碼或電子郵件地址做為使用者名稱。當他們更新應用程式中的電子郵件地址或電話號碼時，Amazon Cognito 可以立即傳送訊息給他們，其中包含可驗證其擁有新屬性值的代碼。若要啟用這些驗證碼的自動傳送，請參閱 [設定電子郵件或電話驗證](user-pool-settings-email-phone-verification.md)。

收到驗證碼的使用者必須在 [VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html) 請求中提供該程式碼回 Amazon Cognito。他們提供程式碼後，其屬性會標示為已驗證。一般而言，當使用者更新其電子郵件地址或電話號碼時，您需要先驗證他們是否擁有新值，才能使用它來登入和接收訊息。使用者集區具有可設定的選項，可判斷使用者是否必須驗證其電子郵件地址或電話號碼的更新。

此選項是使用者集區屬性 `AttributesRequireVerificationBeforeUpdate`。在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-UserAttributeUpdateSettings) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html#CognitoUserPools-UpdateUserPool-request-UserAttributeUpdateSettings) 請求中設定，或在 Amazon Cognito 主控台**的註冊**功能表中**等待更新時，使用 設定保持原始屬性值作用中**。

您的使用者集區如何處理電子郵件地址的更新，且電話號碼已連線至使用者集區的使用者名稱組態。使用者集區使用者名稱可以位於*使用者名稱屬性*組態中，其中登入名稱為電子郵件地址、電話號碼或兩者。它們也可以位於*別名屬性*組態中，其中`username`屬性是登入名稱，以及電子郵件地址、電話號碼或偏好的使用者名稱作為替代登入名稱。如需詳細資訊，請參閱[自訂登入屬性](user-pool-settings-attributes.md#user-pool-settings-aliases)。

 您也可以使用自訂訊息 Lambda 觸發來自訂驗證訊息。如需詳細資訊，請參閱[自訂訊息 Lambda 觸發程序](user-pool-lambda-custom-message.md)。當使用者的電子郵件地址或電話號碼未經驗證時，您的應用程式應該通知使用者他們必須驗證 屬性，並提供按鈕或連結供使用者輸入其驗證碼。

下表說明當使用者變更其登入屬性的值時， `AttributesRequireVerificationBeforeUpdate`和別名設定如何決定結果。


| 使用者名稱組態 | 使用者必須驗證新屬性的行為 | 使用者不需要驗證新屬性的行為 | 
| --- | --- | --- | 
| 使用者名稱屬性 | 原始屬性會保持驗證、符合登入資格，並以原始值顯示。當使用者驗證新值時，Amazon Cognito 會更新屬性值、將其標記為已驗證，並使其符合登入資格。 | Amazon Cognito 會將屬性更新為新值。新值符合登入資格。當使用者驗證新值時，Amazon Cognito 會將其標記為已驗證。 | 
| 別名屬性 | 原始屬性會保持驗證、符合登入資格，並以原始值顯示。當使用者驗證新值時，Amazon Cognito 會更新屬性值、將其標記為已驗證，並使其符合登入資格。 | Amazon Cognito 會將屬性更新為新值。原始或新的屬性值都不符合登入資格。當使用者驗證新值時，Amazon Cognito 會更新屬性值、將其標記為已驗證，並使其符合登入資格。 | 

**範例 1**  
使用者 1 使用電子郵件地址登入您的應用程式，`user1@example.com`並具有使用者名稱 `user1`（別名屬性）。您的使用者集區已設定為驗證登入屬性的更新，並自動傳送驗證訊息。他們請求將其電子郵件地址更新為 `user1+foo@example.com`。他們會在 收到驗證電子郵件`user1+foo@example.com`，並且*只能使用電子郵件地址 再次登入*`user1@example.com`。稍後，他們會輸入其驗證碼，並且只能使用電子郵件地址 再次登入`user1+foo@example.com`。

**範例 2**  
使用者 2 使用電子郵件地址登入您的應用程式，`user2@example.com`並具有使用者名稱 （別名屬性）。您的使用者集區設定為*不*驗證登入屬性的更新，並自動傳送驗證訊息。他們請求將其電子郵件地址更新為 `user2+bar@example.com`。他們會在 收到驗證電子郵件`user2+bar@example.com`，*無法再次登入*。稍後，他們會輸入其驗證碼，並且只能使用電子郵件地址 再次登入`user2+bar@example.com`。

**範例 3**  
使用者 3 使用電子郵件地址登入您的應用程式，`user3@example.com`但沒有使用者名稱 （使用者名稱屬性）。您的使用者集區設定為*不*驗證登入屬性的更新，並自動傳送驗證訊息。他們請求將其電子郵件地址更新為 `user3+baz@example.com`。他們會在 收到驗證電子郵件`user3+baz@example.com`，但*可以立即登入*，而不需使用驗證碼採取其他動作。

## 由管理員或開發人員建立之使用者帳戶的確認和驗證程序
<a name="confirmation-and-verification-of-users-whose-accounts-youve-created"></a>

由管理員或開發人員建立的使用者帳戶已經是已確認狀態，因此使用者不需要輸入確認碼。Amazon Cognito 服務傳送給這些使用者的邀請訊息包含使用者名稱和臨時密碼。使用者必須先變更密碼，才能登入。如需詳細資訊，請參閱[建立使用者帳戶為管理員](how-to-create-user-accounts.md)中的[自訂電子郵件和 SMS 訊息](how-to-create-user-accounts.md#creating-a-new-user-customize-messages)，以及[使用 Lambda 觸發程序來自訂使用者集區工作流程](cognito-user-pools-working-with-lambda-triggers.md)中的自訂訊息觸發器。

## 匯入的使用者帳戶的確認和驗證程序
<a name="confirmation-and-verification-of-users-whose-accounts-youve-imported"></a>

使用 、 CLI AWS 管理主控台或 API （請參閱[從 CSV 檔案將使用者匯入使用者集區](cognito-user-pools-using-import-tool.md)) 中的使用者匯入功能建立的使用者帳戶已處於確認狀態，因此使用者不需要輸入確認碼。不會傳送任何邀請訊息。不過，匯入的使用者帳戶需要使用者先呼叫 `ForgotPassword`API 來請求代碼，然後呼叫 `ConfirmForgotPassword` API，以使用所傳送的代碼來建立密碼，之後才能登入。如需詳細資訊，請參閱[需要匯入的使用者重設密碼](cognito-user-pools-using-import-tool.md#cognito-user-pools-using-import-tool-password-reset)。

當使用者帳戶匯入時，使用者的電子郵件或電話號碼必須標記為已驗證，因此在使用者登入時，不需要進行驗證。

## 在測試應用程式時傳送電子郵件
<a name="managing-users-accounts-email-testing"></a>

當使用者在您使用者集區的用戶端應用程式中建立和管理其帳戶時，Amazon Cognito 會傳送電子郵件訊息給使用者。如果您將使用者集區設定成要求電子郵件驗證，Amazon Cognito 便會在以下情況傳送電子郵件：
+ 使用者註冊。
+ 使用者更新其電子郵件地址。
+ 使用者執行某項動作而呼叫了 `ForgotPassword` API 動作。
+ 您以管理員的身分建立使用者帳戶。

視發出電子郵件的動作而定，此電子郵件將包含驗證碼或臨時密碼。您的使用者必須接收這類電子郵件並了解其訊息內容，否則可能無法登入與使用您的應用程式。

為確保順利傳送電子郵件且訊息內容正確無誤，請在您的應用程式中測試從 Amazon Cognito 起始電子郵件傳遞的動作。例如，您可以使用應用程式的註冊頁面或使用 `SignUp` API 動作，透過註冊測試電子郵件地址的方式發出電子郵件。以這種方式測試時，請牢記以下要點：

**Important (重要)**  
當您使用電子郵件地址測試從 Amazon Cognito 發出電子郵件的動作時，切勿使用虛假 (信箱不存在) 的電子郵件地址。請使用能夠收到 Amazon Cognito 發出電子郵件的真實電子郵件地址，以免導致*硬退信*的狀況。  
硬退信是由於 Amazon Cognito 未能將電子郵件傳遞至收件人的信箱所造成，若信箱不存在就一定會發生。  
Amazon Cognito 會限制持續產生硬退信 AWS 的帳戶可傳送的電子郵件數量。

當您測試發出電子郵件的動作時，請使用以下任一種電子郵件地址避免造成硬退信：
+ 您所擁有且專供測試用的電子郵件帳戶的地址。若您使用自有的電子郵件地址，便能收到由 Amazon Cognito 傳送的電子郵件。有了這封電子郵件，您即可使用驗證碼測試應用程式的註冊經驗。如果您為使用者集區自訂了電子郵件訊息，就可以檢查自訂內容是否正確無誤。
+ 信箱模擬器地址 *success@simulator.amazonses.com*。若您使用模擬器地址，Amazon Cognito 將能順利傳送電子郵件，但您無法查看其內容。當您無須使用驗證碼且不必檢查電子郵件訊息時，即適用此選項。
+ 附加任意標籤的信箱模擬器地址，如 *success\$1user1@simulator.amazonses.com* 或 *success\$1user2@simulator.amazonses.com*。Amazon Cognito 將能順利傳送電子郵件至這類地址，但您無法查看其傳送的電子郵件。當您希望透過新增多名測試使用者至使用者集區的方式測試註冊程序，而且每一名測試使用者皆有其獨一的電子郵件地址時，即適用此選項。

# 設定電子郵件或電話驗證
<a name="user-pool-settings-email-phone-verification"></a>

您可以在**身分驗證方法**選單下選擇電子郵件或電話驗證的設定。有關多重要素驗證 (MFA) 的詳細資訊，請參閱[簡訊 MFA](user-pool-settings-mfa-sms-email-message.md)。

Amazon Cognito 使用 Amazon SNS 以傳送 簡訊。如果您尚未從 Amazon Cognito 或任何其他 傳送 SMS 訊息 AWS 服務 ，Amazon SNS 可能會將您的帳戶放在 SMS 沙盒中。我們建議您先將測試訊息傳送到已驗證的電話號碼，然後再將帳戶從沙盒移至生產環境。此外，如果您打算將簡訊傳送至美國目的地電話號碼，必須向 Amazon Pinpoint 取得來源或寄件者 ID。若要為簡訊設定 Amazon Cognito 使用者集區，請參閱 [Amazon Cognito 使用者集區的簡訊設定](user-pool-sms-settings.md)。

Amazon Cognito 可以自動驗證電子郵件地址或電話號碼。若要進行此驗證，Amazon Cognito 會傳送驗證碼或驗證連結。如果是電子郵件地址，Amazon Cognito 會以電子郵件訊息傳送代碼或連結。您可以在 Amazon Cognito 主控台的訊息範本選單中編輯**驗證訊息**範本時，選擇**程式碼**或**連結**的驗證**類型**。 ****如需詳細資訊，請參閱[自訂電子郵件驗證訊息](cognito-user-pool-settings-message-customizations.md#cognito-user-pool-settings-email-verification-message-customization)。

如果是電話號碼，Amazon Cognito 會以簡訊傳送驗證碼。

Amazon Cognito 必須驗證電話號碼或電子郵件地址以確認使用者，並協助使用者恢復忘記的密碼。或者，您也可以利用預先註冊 Lambda 觸發程序或 [AdminConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminConfirmSignUp.html) API 操作來自動確認使用者。如需詳細資訊，請參閱[註冊及確認使用者帳戶](signing-up-users-in-your-app.md)。

驗證碼或連結的有效時間為 24 小時。

如果您選擇要求驗證電子郵件地址或電話號碼，Amazon Cognito 會在使用者註冊時自動傳送驗證碼或連結。如果使用者集區具有 [自訂 SMS 寄件者 Lambda 觸發程序](user-pool-lambda-custom-sms-sender.md) 或 [自訂電子郵件寄件者 Lambda 觸發程序](user-pool-lambda-custom-email-sender.md)，將會改為叫用該函數。

**備註**  
Amazon SNS 會針對其用於驗證電話號碼的簡訊部分另外收費。傳送電子郵件訊息是免費的。如需 Amazon SNS 定價的相關資訊，請參閱[全球 SMS 定價](https://aws.amazon.com/sns/sms-pricing/)。如需可使用 SMS 簡訊的國家/地區最新清單，請參閱[支援的區域和國家](https://docs.aws.amazon.com/sns/latest/dg/sms_supported-countries.html)。
當您在應用程式中測試從 Amazon Cognito 產生電子郵件的動作時，請使用 Amazon Cognito 能夠送達而不致發生硬退信狀況的真實電子郵件地址。如需詳細資訊，請參閱[在測試應用程式時傳送電子郵件](signing-up-users-in-your-app.md#managing-users-accounts-email-testing)。
忘記密碼流程需要使用者的電子郵件或電話號碼以驗證使用者。

**重要**  
如果使用者同時使用電子郵件地址和電話號碼來進行註冊，而您的使用者集區設定要求這兩個屬性都要驗證，Amazon Cognito 會透過簡訊將驗證碼傳送至該電話號碼。Amazon Cognito 尚未驗證電子郵件地址，因此您的應用程式必須呼叫 [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html)，查看是否有電子郵件地址正在等待驗證。如果確實需要驗證，應用程式必須呼叫 [GetUserAttributeVerificationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAttributeVerificationCode.html) 以啟動電子郵件驗證流程。然後它必須藉由呼叫 [VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html) 提交驗證碼。

您可以調整 AWS 帳戶 和個別訊息的簡訊花費配額。這些限制僅適用於傳送簡訊的成本。如需詳細資訊，請參閱 [Amazon SNS 常見問答集](https://aws.amazon.com/sns/faqs/)中的**什麼是帳戶層級與訊息層級費用配額及其運作方式？**。

Amazon Cognito 會在 AWS 區域 您建立使用者集區的 中使用 Amazon SNS 資源，或在**舊版 Amazon SNS 替代區域中**從下表傳送簡訊。亞太 (首爾) 區域的 Amazon Cognito 使用者集區除外。這些使用者集區使用您在亞太 (東京) 區域的 Amazon SNS 組態。如需詳細資訊，請參閱[選擇 SMS 訊息 AWS 區域 的](user-pool-sms-settings.md#sms-choose-a-region)。


| Amazon Cognito 區域 | 舊式 Amazon SNS 備用區域 | 
| --- | --- | 
| 美國東部 (俄亥俄) | 美國東部 (維吉尼亞北部) | 
| 亞太地區 (孟買) | 亞太地區 (新加坡) | 
| 亞太地區 (首爾) | 亞太地區 (東京) | 
| 加拿大 (中部) | 美國東部 (維吉尼亞北部) | 
| 歐洲 (法蘭克福) | 歐洲 (愛爾蘭) | 
| 歐洲 (倫敦) | 歐洲 (愛爾蘭) | 

**範例**：如果您的 Amazon Cognito 使用者集區位於亞太區域 (孟買)，而且已在 ap-southeast-1 區域增加支出限制，那麼您可能不希望個別請求增加 ap-south-1 的支出限制。反之，您可以使用亞太區域 (新加坡) 的 Amazon SNS 資源。

## 驗證對電子郵件地址和電話號碼的更新
<a name="user-pool-settings-verifications-verify-attribute-updates"></a>

在使用者變更電子郵件地址或電話號碼屬性值後，該屬性會立即變為作用中且未驗證。Amazon Cognito 還會要求您的使用者在 Amazon Cognito 更新屬性之前先驗證新值。當您要求使用者先驗證新值時，他們可以使用原始值登入與接收訊息，直到他們驗證新值為止。

當使用者可以將其電子郵件地址或電話號碼作為您使用者集區中的登入別名時，已更新屬性的登入名稱取決於您是否要求驗證已更新的屬性。當您要求使用者驗證已更新的屬性時，使用者可以使用原始屬性值登入，直到他們驗證新值為止。如果您不要求使用者驗證已更新的屬性，則使用者無法以新的或原始屬性值登入或接收訊息，直到他們驗證新值為止。

例如，您的使用者集區允許以電子郵件地址別名登入，且要求使用者在更新時驗證其電子郵件地址。Sue 使用 `sue@example.com` 登入，她想要將電子郵件地址變更為 `sue2@example.com`，但不小心輸入成 `ssue2@example.com`。Sue 沒有收到驗證電子郵件，因此無法驗證 `ssue2@example.com`。Sue 使用 `sue@example.com` 登入，並在您的應用程式中重新提交表單，將其電子郵件地址變更為 `sue2@example.com`。她收到此電子郵件，將驗證碼提供給您的應用程式，並開始使用 `sue2@example.com` 登入。

**當使用者更新屬性且您的使用者集區驗證新屬性值時**
+ 他們可以在確認代碼以驗證新值之前，使用原始屬性值登入。
+ 他們只能在確認代碼以驗證新值之後，使用新屬性值登入。
+ 如果您在 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 請求中將 `email_verified` 或 `phone_number_verified` 設定為 `true`，則他們可以在確認 Amazon Cognito 傳送給他們的代碼之前登入。

**當使用者更新屬性，但您的使用者集區未驗證新屬性值時**
+ 他們無法使用原始屬性值登入或接收訊息。
+ 在確認代碼以驗證新值之前，他們無法使用新屬性值登入或接收確認碼以外的訊息。
+ 如果您在 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 請求中將 `email_verified` 或 `phone_number_verified` 設定為 `true`，則他們可以在確認 Amazon Cognito 傳送給他們的代碼之前登入。

## 要求使用者更新其電子郵件地址或電話號碼時需要驗證屬性


1. 登入 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

1. 在導覽窗格中，選擇 **User Pools** (使用者集區)，然後選擇您要編輯的使用者集區。

1. 在**註冊**功能表中，選擇**屬性驗證和使用者帳戶確認**下的**編輯**。

1. 選擇 **Keep original attribute value active when an update is pending** (當更新待處理時，保持原始屬性值處於作用中)。

1. 在 **Active attribute values when an update is pending** (更新待處理時的作用中屬性值) 下方，選擇您希望在 Amazon Cognito 更新值之前要求使用者驗證的屬性。

1. 選擇**儲存變更**。

如欲要求使用 Amazon Cognito API 進行屬性更新驗證，您可以設定 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 請求中的 `AttributesRequireVerificationBeforeUpdate` 參數。

## 授權 Amazon Cognito 代表您傳送 SMS 訊息
<a name="user-pool-settings-verifications-iam-role-for-sms"></a>

Amazon Cognito 需要您的許可，才能代表您傳送簡訊給使用者。若要授予該許可，您可以建立 AWS Identity and Access Management (IAM) 角色。在 SMS 下的 Amazon Cognito 主控台的**身分驗證方法**選單中，選擇**編輯**以設定角色。

# 設定 MFA、身分驗證、驗證和邀請訊息
<a name="cognito-user-pool-settings-message-customizations"></a>

使用 Amazon Cognito，您可以自訂簡訊和電子郵件身分驗證、驗證和使用者邀請訊息，以增強應用程式的安全性和使用者體驗。您可以在部分訊息的程式碼型和一鍵式連結驗證之間進行選擇。本主題討論如何在 Amazon Cognito 主控台中個人化身分驗證和驗證通訊。

在**訊息範本**選單中，您可以自訂：
+ 用於一次性密碼 (OTP) 和多重要素 (MFA) 身分驗證的電子郵件和簡訊範本
+ 您的簡訊和電子郵件驗證訊息
+ 電子郵件的驗證類型：代碼或連結
**注意**  
當使用者註冊或重新傳送確認碼時，Amazon Cognito 會在驗證訊息中傳送連結與您的連結型範本。屬性更新和密碼重設操作的電子郵件會使用程式碼範本。
+ 您的使用者邀請訊息
+ 通行於使用者集區之電子郵件的 FROM (寄件者) 和 REPLY-TO (回覆至) 電子郵件地址

**注意**  
只有當您選擇需要電話號碼和電子郵件驗證時，簡訊和電子郵件驗證訊息範本才會顯示。同樣地，MFA 設定必須是 **required** (必要) 或 **optional** (選用)，才會顯示 SMS MFA 訊息範本。

**Topics**
+ [訊息範本](#cognito-user-pool-settings-message-templates)
+ [自訂電子郵件和簡訊 MFA 訊息](#cognito-user-pool-settings-SMS-message-customization)
+ [自訂電子郵件驗證訊息](#cognito-user-pool-settings-email-verification-message-customization)
+ [自訂使用者邀請訊息](#cognito-user-pool-settings-user-invitation-message-customization)
+ [自訂您的電子郵件地址](#cognito-user-pool-settings-email-address-customization)
+ [授權 Amazon Cognito 代表您傳送 Amazon SES 電子郵件 (從自訂 FROM (寄件者) 電子郵件地址)](#cognito-user-pool-settings-ses-authorization-to-send-email)

## 訊息範本
<a name="cognito-user-pool-settings-message-templates"></a>

您可以使用訊息範本將預留位置插入訊息。Amazon Cognito 會將預留位置取代為對應的值。您可以在任何類型的訊息範本中參考*通用範本預留位置*，雖然這些值不會出現在所有訊息類型中。


**通用範本預留位置**  

|  Description  |  權杖  | 訊息類型 | 
| --- | --- | --- | 
| 驗證碼 | \$1\$1\$1\$1\$1\$1 | 驗證、確認和 MFA 訊息 | 
| 臨時密碼 | \$1\$1\$1\$1\$1\$1 | 忘記密碼和邀請訊息 | 
| 使用者名稱 | \$1username\$1 | 邀請和進階安全訊息 | 

具有[威脅防護](cognito-user-pool-settings-threat-protection.md)的其中一個可用自動化回應是通知使用者 Amazon Cognito 偵測到潛在惡意活動。您可以使用進階安全範本預留位置來執行下列作業，如下所示：
+ 包含事件的特定詳細資訊，例如 IP 地址、城市、國家、登入時間和裝置名稱。Amazon Cognito 威脅防護可以分析這些詳細資訊。
+ 驗證一鍵式連結是否有效。
+ 使用事件 ID、意見回饋權杖和使用者名稱，建置您自己的一鍵式連結。

**注意**  
若要在進階安全性電子郵件範本中產生一鍵式連結接並使用 `{one-click-link-valid}` 和 `{one-click-link-invalid}` 預留位置，您必須已經為使用者集區設定網域。

威脅防護會新增下列預留位置，您可以將這些預留位置插入訊息範本。這些預留位置適用於**自適應身分驗證訊息**，即 Amazon Cognito 傳送給工作階段已評估風險層級的使用者的通知。若要使用這些變數設定訊息範本，請在 Amazon Cognito 主控台中更新威脅防護的**全功能**組態，或在 [SetRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetRiskConfiguration.html) 請求中提交範本。


**進階安全範本預留位置**  

|  Description  |  權杖  | 
| --- | --- | 
| IP 位址 | \$1ip-address\$1 | 
| City | \$1city\$1 | 
| Country | \$1country\$1 | 
| 登入時間 | \$1login-time\$1 | 
| 裝置名稱 | \$1device-name\$1 | 
| 一鍵式連結有效 | \$1one-click-link-valid\$1 | 
| 一鍵式連結無效 | \$1one-click-link-invalid\$1 | 
| 事件 ID | \$1event-id\$1 | 
| 意見回饋權杖 | \$1feedback-token\$1 | 

## 自訂電子郵件和簡訊 MFA 訊息
<a name="cognito-user-pool-settings-SMS-message-customization"></a>

若要自訂[多重要素驗證 (MFA)](user-pool-settings-mfa.md) 的 SMS 和電子郵件訊息，請從 Amazon Cognito 使用者集區主控台中的**訊息範本**選單編輯 **MFA 訊息**。

**重要**  
您的自訂訊息必須包含 `{####}` 預留位置。傳送訊息前，此預留位置會取代為身分驗證代碼。

Amazon Cognito 會將 SMS 訊息的長度上限設定為 140 個 UTF-8 字元，包括驗證碼。

### 自訂 SMS 驗證訊息
<a name="cognito-user-pool-settings-SMS-verification-message-customization"></a>

若要自訂電話號碼驗證的 SMS 訊息，請從使用者集區的訊息範本選單編輯**驗證訊息****範本**。

**重要**  
您的自訂訊息必須包含 `{####}` 預留位置。傳送訊息前，此預留位置會取代為驗證碼。

訊息的長度上限為 140 個 UTF-8 字元，包括驗證碼。

## 自訂電子郵件驗證訊息
<a name="cognito-user-pool-settings-email-verification-message-customization"></a>

若要使用 Amazon Cognito 驗證使用者集區中使用者的電子郵件地址，可以向使用者發送電子郵件，其中包含一個使用者可選取接的連結，或者可以向使用者發送可供其輸入的代碼。

若要自訂電子郵件地址驗證訊息的電子郵件主旨和訊息內容，請在使用者集區的訊息範本選單中編輯**驗證****訊息範本**。當您編輯 **驗證訊息** 範本時，可以選擇 **代碼** 或 **連結** 的 **驗證類型**。

在您選擇 **代碼** 作為驗證類型時，您的自訂訊息就必須包含 `{####}` 預留位置。當您傳送訊息時，驗證碼會取代此預留位置。

在您選擇 **連結** 作為驗證類型時，您的自訂訊息就必須包含 `{##Verify Your Email##}` 格式的預留位置。您可以變更預留位置字元之間的文字字串，例如 `{##Click here##}`。標題為*驗證您的電子郵件*的驗證鏈接會取代此預留位置。

電子郵件驗證訊息的連結會將您的使用者引導至 URL，如下列範例所示。

```
https://<your user pool domain>/confirmUser/?client_id=abcdefg12345678&user_name=emailtest&confirmation_code=123456
```

訊息的長度上限為 20,000 個 UTF-8 字元，包括驗證碼 (如果有)。您可以在此訊息中使用 HTML 標籤來格式化內容。

## 自訂使用者邀請訊息
<a name="cognito-user-pool-settings-user-invitation-message-customization"></a>

您可以在訊息範本選單中編輯**邀請訊息**範本，自訂 Amazon Cognito 透過簡訊或電子郵件訊息傳送給新使用者**的使用者**邀請訊息。

**重要**  
您的自訂訊息必須包含 `{username}` 和 `{####}` 預留位置。Amazon Cognito 傳送邀請訊息時，會以使用者的使用者名稱和密碼取代這些預留位置。

SMS 訊息的長度上限為 140 個 UTF-8 字元，包括驗證碼。電子郵件訊息的長度上限為 20,000 個 UTF-8 字元，包括驗證碼。您可以在此電子郵件訊息中使用 HTML 標籤來格式化內容。

## 自訂您的電子郵件地址
<a name="cognito-user-pool-settings-email-address-customization"></a>

依預設，Amazon Cognito 會從地址 **no-reply@verificationemail.com** 傳送電子郵件訊息給使用者集區中的使用者。您可以選擇指定自訂 FROM (寄件者) 電子郵件地址和 REPLY-TO (回覆至) 電子郵件地址，而不要使用 **no-reply@verificationemail.com**。

**自訂 FROM (寄件者) 電子郵件地址和 REPLY-TO (回覆至) 電子郵件地址**

1. 導覽到 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**身分驗證方法**選單。在 **Email** (電子郵件) 下，選擇 **Edit** (編輯)。

1. 選擇 **SES Region** (SES 區域)。

1. 從您已使用所選 **SES Region** (SES 區域) 中 Amazon SES 進行驗證的電子郵件地址清單中，選擇 **FROM email address** (寄件者電子郵件地址)。若要使用已驗證網域的電子郵件地址，請在 AWS AWS Command Line Interface 或 API 中設定電子郵件設定。如需詳細資訊，請參閱*《Amazon Simple Email Service 開發人員指南》*中的[在 Amazon SES 中驗證電子郵件地址和網域](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-addresses-and-domains.html)。

1. 從您所選擇 **SES Region** (SES 區域) 中的組態設定清單中選擇 **Configuration set** (組態集)。

1. 請為您的電子郵件訊息輸入易於使用的 **FROM sender name** (FROM (寄件者) 傳送人名稱)，格式為 `John Stiles <johnstiles@example.com>`。

1. 若要自訂 REPLY-TO (回覆至) 電子郵件地址，請在 **REPLY-TO email address (回覆至電子郵件地址)** 欄位中輸入有效的電子郵件地址。

## 授權 Amazon Cognito 代表您傳送 Amazon SES 電子郵件 (從自訂 FROM (寄件者) 電子郵件地址)
<a name="cognito-user-pool-settings-ses-authorization-to-send-email"></a>

您可以將 Amazon Cognito 設定為從自訂 FROM (寄件者) 電子郵件地址，而非其預設地址，傳送電子郵件。若要使用自訂地址，您必須授予 Amazon Cognito 許可，才能從 Amazon SES 驗證的身分傳送電子郵件訊息。大部分情況，您可以透過建立傳送授權政策授予許可。如需詳細資訊，請參閱*《Amazon Simple Email Service 開發人員指南》*中的[搭配 Amazon SES 使用傳送授權](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/sending-authorization.html)。

當您將使用者集區設定為使用 Amazon SES 來傳送電子郵件訊息時，Amazon Cognito 會在您帳戶中建立 `AWSServiceRoleForAmazonCognitoIdpEmailService` 角色，以授予對 Amazon SES 的存取權。使用 `AWSServiceRoleForAmazonCognitoIdpEmailService` 服務連結角色時，不需要傳送授權政策。當您在使用者集區中使用這兩個預設電子郵件功能時，只需要新增傳送授權政策*和*經過驗證的 Amazon SES 身分作為 FROM (寄件者) 地址。

如需 Amazon Cognito 所建立服務連結角色的詳細資訊，請參閱[使用 Amazon Cognito 的服務連結角色](using-service-linked-roles.md)。

下列範例傳送授權政策會向 Amazon Cognito 授予使用 Amazon SES 已驗證身分的有限能力。執行此操作時，Amazon Cognito 只能代表 `aws:SourceArn` 條件中的使用者集區和 `aws:SourceAccount` 條件中的帳戶傳送電子郵件訊息。如需更多範例，請參閱*《Amazon Simple Email Service 開發人員指南》*中的 [Amazon SES 傳送授權政策範例](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/sending-authorization-policy-examples.html)。

**注意**  
在這個範例中，"Sid" 值是唯一識別陳述式的任意字串。如需政策語法的詳細資訊，請參閱*《Amazon Simple Email Service 開發人員指南》*中的 [Amazon SES 傳送授權政策](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/sending-authorization-policies.html)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "stmnt1234567891234",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "email.cognito-idp.amazonaws.com"
                ]
            },
            "Action": [
                "SES:SendEmail",
                "SES:SendRawEmail"
            ],
            "Resource": "arn:aws:ses:us-east-1:111122223333:identity/support@example.com",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:cognito-idp:us-east-1:111122223333:userpool/us-east-1_EXAMPLE"
                }
            }
        }
    ]
}
```

------

您從下拉式選單選取 Amazon SES 身分時，Amazon Cognito 主控台就會為您新增類似政策。如果您使用 CLI 或 API 來設定使用者集區，則必須將結構與之前範例相似的政策連接至您的 Amazon SES 身分。

# 建立使用者帳戶為管理員
<a name="how-to-create-user-accounts"></a>

使用者集區不只是客戶身分和存取管理 (CIAM) 使用者目錄，網際網路上的任何人都可以在應用程式中註冊使用者設定檔。您可以停用自助式註冊。您可能已經認識您的客戶，並只想認可已事先獲得授權的客戶。您可以使用[私有 SAML 2.0 或 OIDC 身分提供者](cognito-user-pools-identity-federation.md)、[匯入使用者](cognito-user-pools-import-users.md)、在[註冊時篩選使用者](user-pool-lambda-pre-sign-up.md)，或使用管理 API 操作建立使用者，在應用程式周圍放置手動身分驗證護欄。管理建立使用者的工作流程可以是程式設計的，在使用者註冊到另一個系統後佈建使用者，也可以是 Amazon Cognito 主控台中的case-by-case或測試。

當您以管理員身分建立使用者時，Amazon Cognito 會為其設定臨時密碼，並傳送歡迎或邀請訊息。他們可以遵循邀請訊息中的連結，第一次登入，設定密碼並確認其帳戶。以下頁面說明如何建立新的使用者並設定歡迎訊息。如需使用使用者集區 API 和 AWS SDK 或 CDK 建立使用者的詳細資訊，請參閱 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html)。

建立使用者集區後，您可以使用 AWS 管理主控台以及 AWS Command Line Interface 或 Amazon Cognito API 來建立使用者。您可以在使用者集區中為新使用者建立設定檔，然後透過簡訊或電子郵件，傳送附有註冊指示的歡迎訊息給使用者。

以下是管理員如何在使用者集區中管理使用者的一些範例。
+ 在 Amazon Cognito 主控台或使用 `AdminCreateUser` API 操作建立新的使用者設定檔。
+ 讓username-and-password、無密碼、通行金鑰和自訂[身分驗證流程](amazon-cognito-user-pools-authentication-flow-methods.md)可供您的使用者集區和應用程式用戶端使用。
+ 設定使用者屬性值。
+ 建立自訂屬性。
+ 在 `AdminCreateUser` API 請求中設定不可變[自訂屬性](user-pool-settings-attributes.md#user-pool-settings-custom-attributes)的值。此功能無法在 Amazon Cognito 主控台中使用。
+ 指定臨時密碼、建立沒有密碼的使用者，或允許 Amazon Cognito 自動產生密碼。
+ 建立新的使用者並自動確認其帳戶、驗證其電子郵件地址或驗證其電話號碼。
+ 透過 AWS 管理主控台 或 Lambda 觸發條件為新使用者指定自訂簡訊和電子郵件邀請訊息，例如[自訂訊息](user-pool-lambda-custom-message.md)、[自訂簡訊寄件](user-pool-lambda-custom-sms-sender.md)者和[自訂電子郵件寄件者](user-pool-lambda-custom-email-sender.md)。
+ 指定是否要透過簡訊及/或電子郵件傳送邀請訊息。
+ 呼叫 `AdminCreateUser`API，並為 `RESEND` 參數指定 `MessageAction`，以重送歡迎訊息給現有的使用者。
+ 在建立使用者時[，隱藏](#admincreateuserwalkthrough-step-invitationmessage)傳送邀請訊息。
+ 為新使用者帳戶指定最長 90 天的過期時間限制。
+ 允許使用者自行登入，或要求僅限由管理員新增新使用者。

管理員也可以使用伺服器端應用程式中的 AWS 登入資料登入使用者。如需詳細資訊，請參閱[API 和 SDK 身分驗證的授權模型](authentication-flows-public-server-side.md)。

## 使用者身分驗證流程和建立使用者
<a name="how-to-create-user-accounts-flows"></a>

使用者管理建立的選項會根據使用者集區的組態而有所不同。身分*驗證流程*或可供使用者登入和 MFA 使用的方法，可以變更您建立使用者的方式，以及您傳送給他們的訊息。以下是一些可在使用者集區中使用的身分驗證流程。
+ 使用者名稱和密碼
+ 通行密鑰
+ 使用第三方 IdPs登入
+ 無密碼與電子郵件和簡訊一次性密碼 OTPs)
+ 使用電子郵件、SMS 和 Authenticator-app OTPs多重要素驗證
+ 使用 Lambda 觸發程序進行自訂身分驗證

如需如何設定這些登入因素的詳細資訊，請參閱 [使用 Amazon Cognito 使用者集區進行身分驗證](authentication.md)。

## 建立不含密碼的使用者
<a name="how-to-create-user-accounts-thingstoknow-passwordless"></a>

如果您已啟用使用者集區的無密碼登入，則可以建立沒有密碼的使用者。若要建立沒有密碼的使用者，您必須提供可用無密碼登入因素的屬性值。例如，如果您的使用者集區中有電子郵件 OTP 無密碼登入，您可以建立沒有密碼和電子郵件地址屬性的使用者。如果唯一可供新使用者使用的身分驗證流程需要密碼，例如密碼金鑰或使用者名稱密碼，您必須為每個新使用者建立或產生臨時密碼。

**建立沒有密碼的新使用者**
+ 選擇**不在 Amazon Cognito 主控台中設定密碼** Amazon Cognito 
+ 省略或保留空白 `AdminCreateUser` API 請求的`TemporaryPassword`參數

**沒有密碼的使用者會自動確認**  
一般而言，新使用者會取得臨時密碼，並在您建立時進入 `FORCE_CHANGE_PASSWORD` 狀態。當您在沒有密碼的情況下建立使用者時，使用者會立即進入 `CONFIRMED` 狀態。您無法將確認碼重新傳送給 `CONFIRMED` 狀態的這些使用者。

**沒有密碼的使用者的邀請訊息會變更。**  
根據預設，Amazon Cognito 會傳送[邀請訊息](cognito-user-pool-settings-message-customizations.md#cognito-user-pool-settings-user-invitation-message-customization)給新使用者，指出當您建立沒有密碼的使用者`Your username is {userName} and your password is {####}.`時，訊息會指出`Your username is {userName}.`自訂您的邀請訊息，以反映您是否將為使用者設定密碼。省略無`{####}`密碼身分驗證模型中的密碼變數。

**當無密碼因素可用時，您無法自動產生密碼**  
如果您已將使用者集區設定為支援電子郵件或電話 OTP 無密碼登入，則無法自動產生密碼。對於每個將擁有密碼的使用者，您必須在建立其設定檔時設定臨時密碼。

**無密碼使用者必須具有所有必要屬性的值**  
當您建立*沒有*密碼的使用者時，只有在使用者為使用者集區中標記為必要的所有屬性提供值時，您的請求才會成功。這適用於任何必要的屬性，而不只是 OTP 交付所需的電話號碼和電子郵件屬性。

## 建立稍後將提供必要屬性值的使用者
<a name="how-to-create-user-accounts-thingstoknow-password-restrictions"></a>

您可能需要使用者集區中的屬性，但在管理建立使用者之後，在應用程式中的使用者互動期間收集這些屬性。當管理員*使用臨時密碼*建立使用者時，可以省略必要屬性的值。您無法省略無密碼使用者的必要屬性值。

缺少必要屬性值和臨時密碼的使用者，會在第一次登入時收到 [NEW\$1PASSWORD\$1REQUIRED](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#CognitoUserPools-RespondToAuthChallenge-request-ChallengeResponses) 挑戰。然後，他們可以在 `requiredAttributes` 參數中提供缺少必要屬性的值。只有在所有必要屬性都[可變](user-pool-settings-attributes.md#user-pool-settings-custom-attributes)時，您才能建立具有密碼且沒有必要屬性的使用者。如果所需的屬性可從使用者登入的應用程式用戶端[寫入](user-pool-settings-client-apps.md#cognito-user-pools-app-idp-settings-about)，使用者才能完成具有`NEW_PASSWORD_REQUIRED`挑戰和必要屬性值的登入。

當您為管理員建立的使用者設定永久密碼時，其狀態會變更為 ，`CONFIRMED`而且您的使用者集區不會在第一次登入時提示他們輸入新密碼*或*必要的屬性。

## 在 中建立新的使用者 AWS 管理主控台
<a name="creating-a-new-user-using-the-console"></a>

您可以使用 Amazon Cognito 主控台設定使用者密碼要求、設定傳送給使用者的邀請和驗證訊息，以及新增使用者。

### 設定密碼政策並啟用自我註冊
<a name="set-user-password-policy"></a>

您可以設定最低密碼複雜度的設定，以及使用者是否可以在使用者集區中使用公有 API 進行註冊。

**設定密碼政策**

1. 導覽到 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**身分驗證方法**選單並尋找**密碼政策**。選擇**編輯**。

1. 選擇 **Custom** (自訂) 的 **Password policy mode** (密碼政策模式)。

1. 選擇 **Password minimum length** (密碼長度下限)。如需密碼長度要求的限制，請參閱[使用者集區資源配額](https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html#limits-hard)。

1. 選擇 **Password complexity** (密碼複雜度) 要求。

1. 選擇管理員設定的密碼有效期限。

1. 選擇**儲存變更**。

**允許自助註冊**

1. 導覽到 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**註冊**功能表並尋找**自助註冊**。選擇 **Edit** (編輯)。

1. 選擇是否要 **Enable self-registration** (啟用自我註冊)。自我註冊通常用於需要在您的使用者集區中註冊新使用者的公有應用程式用戶端，而無需分發用戶端秘密或 AWS Identity and Access Management (IAM) API 登入資料。
**停用自我註冊**  
如果您未啟用自我註冊，則必須使用 IAM API 憑證透過管理 API 動作或透過聯合身分提供者登入來建立新使用者。

1. 選擇**儲存變更**。

### 自訂電子郵件和 SMS 訊息
<a name="creating-a-new-user-customize-messages"></a>

**自訂使用者訊息**

您可以自訂 Amazon Cognito 在邀請使用者登入、使用者註冊使用者帳戶或使用者登入並收到提示進行多重要素驗證 (MFA) 時傳送給使用者的訊息。
**注意**  
**Invitation message** (邀請訊息) 會在您在使用者集區中建立使用者時傳送，並邀請他們登入。Amazon Cognito 會將初始登入資訊傳送至使用者的電子郵件地址或電話號碼。  
使用者註冊使用者集區中的使用者帳戶時，系統會傳送 **Verification message** (驗證訊息)。Amazon Cognito 會傳送代碼給使用者。當使用者將代碼提供給 Amazon Cognito 時，他們會驗證其聯絡資訊，並確認其帳戶以進行登入。驗證碼有效時間為 24 小時。  
您在使用者集區中啟用 SMS MFA 時，以及已設定 SMS MFA 的使用者登入並提示進行 MFA 時，系統會傳送 **MFA message** (MFA 訊息)。

1. 導覽到 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**訊息範本**選單，然後選取**驗證訊息**、**邀請訊息**或 **MFA 訊息**，然後選擇**編輯**。

1. 自訂所選訊息類型的訊息。
**注意**  
當您自訂訊息時，必須包含訊息範本中的所有變數。如果未包含變數，例如 **\$1\$1\$1\$1\$1\$1**，則您的使用者將沒有足夠的資訊來完成訊息動作。  
如需詳細資訊，請參閱[訊息範本](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-settings-message-templates.html)。

1. 

   1. **驗證訊息**

      1. 選擇 **Email** (電子郵件) 訊息的 **Verification type** (驗證類型)。**Code** (代碼) 驗證會傳送使用者必須輸入的數字碼。**Link** (連結) 驗證會傳送連結，使用者可以按一下以驗證其聯絡資訊。**Link** (連結) 訊息的變數中的文字會顯示為超連結文字。例如，使用變數 \$1\$1\$1Click here\$1\$1\$1 的訊息範本會在電子郵件訊息中顯示為[請點選此處]()。

      1. 輸入 **Email** (電子郵件) 訊息的 **Email subject** (電子郵件主旨)。

      1. 輸入 **Email** (電子郵件) 訊息的自訂 **Email message** (電子郵件訊息) 範本。您可以使用 HTML 自訂此範本。

      1. 輸入 **SMS** 訊息的 **SMS message** (SMS 訊息) 範本。

      1. 選擇**儲存變更**。

   1. **Invitation messages** (邀請訊息)

      1. 輸入 **Email** (電子郵件) 訊息的 **Email subject** (電子郵件主旨)。

      1. 輸入 **Email** (電子郵件) 訊息的自訂 **Email message** (電子郵件訊息) 範本。您可以使用 HTML 自訂此範本。

      1. 輸入 **SMS** 訊息的 **SMS message** (SMS 訊息) 範本。

      1. 選擇**儲存變更**。

   1. **MFA messages** (MFA 訊息)

      1. 輸入 **SMS** 訊息的 **SMS message** (SMS 訊息) 範本。

      1. 選擇**儲存變更**。

### 建立使用者
<a name="creating-a-new-user-using-the-users-tab"></a>

**建立使用者**

您可以從 Amazon Cognito 主控台為您的使用者集區建立新使用者。一般而言，使用者可以在設定密碼之後登入。若要使用電子郵件地址登入，使用者必須分別驗證 `email` 屬性。若要使用電話號碼登入，使用者必須驗證 `phone_number` 屬性。若要確認帳戶為管理員，您也可以使用 AWS CLI 或 API，或使用聯合身分提供者建立使用者設定檔。如需詳細資訊，請參閱《[Amazon Cognito API 參考](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/)》。

1. 導覽到 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**使用者**功能表，然後選擇**建立使用者**。

1. 檢閱 **User pool sign-in and security requirements** (使用者集區登入和安全要求) 以取得有關密碼要求、可用帳戶復原方法和使用者集區別名屬性的指引。

1. <a name="admincreateuserwalkthrough-step-invitationmessage"></a>選擇您要如何傳送 **Invitation message** (邀請訊息)。選擇 SMS 訊息、電子郵件訊息或兩者皆可。若要隱藏邀請訊息，請選擇**不傳送邀請**。
**注意**  
在傳送邀請訊息之前，請在使用者集區的**身分驗證方法**選單中，使用 Amazon Simple Notification Service 和 Amazon Simple Email Service 設定寄件 AWS 區域 者和 。適用收件人訊息和數據傳輸費率。Amazon SES 會單獨向您收取電子郵件訊息費用，Amazon SNS 會單獨向您收取 SMS 訊息費用。

1. 為新使用者選擇 **Username** (使用者名稱)。

1. 選擇您是否要為使用者 **Create a password** (建立密碼) 或允許 Amazon Cognito **Generate a password** (產生密碼)。如果使用者集區中有[無密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)可用，則無法產生密碼的選項。任何臨時密碼必須遵守使用者集區密碼政策。

1. 選擇**建立**。

1. 選擇**使用者**功能表，然後選擇使用者的**使用者名稱**項目。新增和編輯 **User attributes** (使用者屬性) 和 **Group memberships** (群組成員資格)。檢閱 **User event history** (使用者事件歷史記錄)。

# 新增群組至使用者集區
<a name="cognito-user-pools-user-groups"></a>

Amazon Cognito 使用者集區中的群組支援可讓您建立和管理群組、新增使用者至從群組，以及從群組移除使用者。使用群組來建立使用者集合，以管理其許可，或代表不同類型的使用者。您可以將 AWS Identity and Access Management (IAM) 角色指派給群組，以定義群組成員的許可。

您可以在使用者集區中使用群組來建立使用者集合，通常這麼做以為這些使用者設定許可。例如，您可以針對網站和應用程式的讀者、參與者和編輯者，建立個別的使用者群組。若是使用與群組相關聯的 IAM 角色，您還可以為這些不同的群組設定不同的權限，這樣就只有參與者可以在 Amazon S3 中輸入內容，且只有編輯者可以透過 Amazon API Gateway 中的 API 發佈內容。

Amazon Cognito 會為您新增至使用者集區的每個 OIDC、SAMl 和社交[身分提供者](cognito-user-pools-identity-federation.md#cognito-user-pools-identity-federation-how-it-works) (IdP) 建立使用者群組。群組的名稱格式為 `[user pool ID]_[IdP name]`，例如 `us-east-1_EXAMPLE_MYSSO`或 `us-east-1_EXAMPLE_Google`。每個唯一自動產生的 IdP 使用者設定檔都會自動新增至此群組。[連結的使用者](cognito-user-pools-identity-federation-consolidate-users.md)不會自動新增至此群組，但您可以個別程序將其設定檔新增至群組。

您可以從 AWS 管理主控台、 APIs 和 CLI 在使用者集區中建立和管理群組。身為開發人員 （使用 AWS 登入資料），您可以建立、讀取、更新、刪除和列出使用者集區的群組。您也可以新增使用者，以及從群組移除使用者。

在使用者集區中使用群組不會產生額外成本。如需詳細資訊，請參閱 [Amazon Cognito 定價](https://aws.amazon.com/cognito/pricing/)。

## 指派 IAM 角色給群組
<a name="assigning-iam-roles-to-groups"></a>

您可以使用 IAM 角色透過群組來控制資源的許可。IAM 角色包含信任政策和許可政策。角色[信任](https://docs.aws.amazon.com/cognito/latest/developerguide/role-trust-and-permissions.html)政策指定誰可以使用該角色。[許可](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies)政策指定群組成員可以存取的動作和資源。建立 IAM 角色時，請設定角色信任政策讓群組使用者可以擔任該角色。在角色許可政策中，指定您希望群組擁有的許可。

在 Amazon Cognito 中建立群組時，您可以透過提供角色的 [ARN](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns) 來指定 IAM 角色。當群組成員使用 Amazon Cognito 登入時，可以從身分集區接收暫時性登入資料。其許可由相關聯 IAM 角色決定。

個別使用者可以在多個群組中。身為開發人員，當一個使用者在多個群組中時，您有下列選項可以自動選擇 IAM 角色：
+ 您可以為每個群組指派優先順序值。系統會選擇優先順序較高 (值較小) 的群組，並套用其相關聯的 IAM 角色。
+ 您的應用程式在透過身分集區為使用者請求 AWS 登入資料時，也可以在 [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) `CustomRoleARN` 參數指定角色 ARN，以從可用的角色中選擇。指定的 IAM 角色必須符合使用者可用的角色。

## 指定優先順序值給群組
<a name="assigning-precedence-values-to-groups"></a>

一個使用者可以隸屬於多個群組。在使用者的存取權和 ID 權杖中，`cognito:groups` 會宣告包含使用者隸屬的所有群組清單。`cognito:roles`宣告包含對應群組的角色清單。

由於一個使用者可以隸屬於多個群組，因此可以為每個群組各指派一個優先順序。此為非負數，指定在使用者集區中，此群組相對於使用者可隸屬之其他群組的優先順序。零是最高優先順序值。優先順序值較小的群組，優先順序高於較大值或空值的群組。如果使用者隸屬於兩個以上群組，優先順序值最小的群組會將其 IAM 角色套用至使用者 ID 權杖的 `cognito:preferred_role` 宣告。

兩個群組可以有相同的優先順序值。如果發生這種情況，則兩個群組的優先順序相等。如果優先順序值相同的兩個群組具有相同的角色 ARN，則會為每個群組中的使用者，在 ID 權杖的 `cognito:preferred_role`宣告中使用該角色。如果這兩個群組有不同的角色 ARN，則不會在使用者的 ID 權杖中設定 `cognito:preferred_role`宣告。

## 使用群組來控制 Amazon API Gateway 許可
<a name="using-groups-to-control-permission-with-amazon-api-gateway"></a>

您可以在使用者集區中使用群組來控制 Amazon API Gateway 許可。使用者隸屬的群組會包含在來自 `cognito:groups` 宣告之使用者集區的 ID 權杖和存取權杖中。您可以將具有請求的 ID 或存取權杖提交到 Amazon API Gateway，並使用 Amazon Cognito 使用者集區授權方來執行 REST API。如需詳細資訊，請參閱《[API Gateway 開發人員指南](https://docs.aws.amazon.com/apigateway/latest/developerguide/)》中的[使用 Amazon Cognito 使用者集區作為授權方來控制對 REST API 的存取](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)。

您也可以使用自訂 JWT 授權方授權對 Amazon API Gateway HTTP API 的存取。如需詳細資訊，請參閱《[API Gateway 開發人員指南](https://docs.aws.amazon.com/apigateway/latest/developerguide/)》中的[使用 JWT 授權方控制對 HTTP API 的存取](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-jwt-authorizer.html)。

## 群組的限制
<a name="user-pool-user-groups-limitations"></a>

使用者群組具有下列限制：
+ 您可以建立的群組數量受限於 [Amazon Cognito 服務配額](quotas.md)。
+ 群組不能巢狀組合。
+ 您不能在群組中搜尋使用者。
+ 您不能依名稱來搜尋群組，但您可以列出群組。

## 在 中建立新群組 AWS 管理主控台
<a name="creating-a-new-group-using-the-console"></a>

使用下列程序以建立新的群組。

**建立新群組**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

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

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

1. 選擇**群組**功能表，然後選擇**建立群組**。

1. 在 **Create a group** (建立群組) 頁面，**Group name** (群組名稱) 中，輸入新群組的易記名稱。

1. 您可以選擇性地使用下列任一欄位，提供有關此群組的其他資訊：
   + **Description** (描述) – 輸入有關此新群組之用途的詳細資訊。
   + **Precedence** (優先順序) – Amazon Cognito 根據使用者所屬的群組具有較低的優先順序值，評估並套用指定使用者的所有群組許可。系統會選擇優先順序較低的群組，並套用其相關聯的 IAM 角色。如需詳細資訊，請參閱[指定優先順序值給群組](#assigning-precedence-values-to-groups)。
   + **IAM role** (IAM 角色) – 需要控制資源的許可時，您可以將 IAM 角色指派給群組。如果您要將使用者集區與身分集區整合，**IAM role (IAM 角色)** 設定會決定要在使用者的 ID 權杖中指派哪個角色 (如果身分集區設定為從該權杖中選擇角色)。如需詳細資訊，請參閱[指派 IAM 角色給群組](#assigning-iam-roles-to-groups)。
   + **Add users to this group** (將使用者新增至此群組) – 建立後，將現有使用者新增為此群組的成員。

1. 選擇 **Create** (建立) 以確認。

# 管理及搜尋使用者帳戶
<a name="how-to-manage-user-accounts"></a>

使用者集區可以包含數百萬使用者。使用此大小的資料集對管理員來說是一項挑戰。Amazon Cognito 具有尋找和修改使用者設定檔的工具。尋找使用者的首要方法是 Amazon Cognito 主控台**的使用者**功能表，以及 [ListUsers](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html)。在擷取使用者相關資訊的方法中，這些選項不會影響成本，例如 [AdminGetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminGetUser.html)。

本指南的本節提供有關在使用者集區中尋找和更新使用者設定檔的資訊。

## 檢視使用者屬性
<a name="manage-user-accounts-viewing-user-attributes"></a>

使用下列處理程序，在 Amazon Cognito 主控台中檢視使用者屬性。

**檢視使用者屬性**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

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

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

1. 選擇**使用者**選單，然後在清單中選取使用者。

1. 在使用者詳細資訊頁面，**User attributes** (使用者屬性) 下，您可以檢視與使用者相關聯的屬性。

## 重設使用者密碼
<a name="manage-user-accounts-reset-user-password"></a>

使用下列處理程序，在 Amazon Cognito 主控台中重設使用者密碼。

**重設使用者密碼**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

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

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

1. 選擇**使用者**選單，然後在清單中選取使用者。

1. 在使用者詳細資訊頁面上，選擇 **Actions** (動作)、**Reset password** (重設密碼)。

1. 在 **Reset password** (重設密碼) 對話方塊中檢閱資訊，準備好時，選擇 **Reset** (重設)。

   此動作會導致立即傳送確認碼給使用者，並將使用者狀態變更為 `RESET_REQUIRED`，以停用使用者目前的密碼。**Reset password** (重設密碼) 代碼有效期為 1 小時。

## 啟用、停用和刪除使用者帳戶
<a name="manage-user-accounts-enable-disable"></a>

您可以刪除未使用的使用者設定檔，或者，如果您想要暫時防止存取，請停用它們。使用者可以刪除自己的帳戶，但只有使用者集區管理員才能啟用和停用使用者帳戶。

**刪除的影響**  
使用者無法使用已刪除的使用者帳戶登入，若要重新取得存取權， 必須註冊或再次建立。

**停用帳戶的影響**  
當您停用使用者帳戶時，Amazon Cognito 會自動使所有已驗證的工作階段失效、停用使用者帳戶以進行登入，以及[撤銷其存取權和重新整理權杖](token-revocation.md)。當使用者嘗試登入您停用的帳戶`User is not enabled`時，Amazon Cognito 會傳回包含訊息的`invalid_request`錯誤。此行為不會隨著應用程式用戶端[的使用者存在揭露設定](cognito-user-pool-managing-errors.md)而變更。您可以停用本機使用者帳戶和聯合使用者帳戶的本機設定檔。當使用者使用受管登入或傳統託管 UI 登入時，您會停用其帳戶，然後嘗試使用維護其已驗證工作階段的瀏覽器 Cookie 再次登入時，Amazon Cognito 會將他們重新導向至登入頁面。

**啟用帳戶的效果**  
啟用帳戶之後，使用者可以立即登入帳戶。使用者帳戶預設為啟用。使用者的屬性和密碼與其帳戶停用前保持不變。無論您已停用使用者帳戶或分別撤銷重新整理權杖，應用程式撤銷的權杖都會在您啟用擁有權杖的使用者帳戶後保持無效。

------
#### [ Delete a user account (console) ]

**刪除使用者帳戶**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

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

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

1. 選擇**使用者**功能表，然後選取清單中使用者使用者名稱旁的選項按鈕。

1. 選擇 **刪除**。

1. 選擇**停用使用者存取**。

1. 選擇 **刪除**。

------
#### [ Delete a user account (API) ]

使用者可以使用自助access-token-authorized [DeleteUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUser.html) API 操作來刪除其帳戶。以下是`DeleteUser`請求內文的範例。

```
{
   "AccessToken": "eyJra456defEXAMPLE"
}
```

管理員可以使用 IAM 授權的 [AdminDeleteUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDeleteUser.html) API 操作刪除使用者帳戶。以下是`AdminDeleteUser`請求內文的範例。

```
{
   "Username": "testuser",
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------
#### [ Disable a user account (console) ]

**停用使用者帳戶**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

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

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

1. 選擇**使用者**選單，然後在清單中選取使用者的使用者名稱。

1. 在使用者詳細資訊頁面上，選擇**動作**、**停用使用者存取**。

1. 在此建立的對話方塊中，選擇**停用**。

------
#### [ Disable a user account (API) ]

管理員可以使用 IAM 授權 [AdminDisableUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDisableUser.html) API 操作停用使用者帳戶。以下是`AdminDisableUser`請求內文的範例。

```
{
   "Username": "testuser",
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------
#### [ Enable a user account (console) ]

**啟用使用者帳戶**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。如果出現提示，請輸入您的 AWS 登入資料。

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

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

1. 選擇**使用者**選單，然後在清單中選取使用者的使用者名稱。

1. 在使用者詳細資訊頁面上，選擇**動作**、**啟用使用者存取**。

1. 在此建立的對話方塊中，選擇**啟用**。

------
#### [ Enable a user account (API) ]

管理員可以使用 IAM 授權的 [AdminEnableUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminEnableUser.html) API 操作啟用使用者帳戶。以下是`AdminEnableUser`請求內文的範例。

```
{
   "Username": "testuser",
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------

## 搜尋使用者屬性
<a name="manage-user-accounts-searching-user-attributes"></a>

如果您已經建立使用者集區，即可從 **中的 **Users AWS 管理主控台(使用者) 面板進行搜尋。您也可以使用 Amazon Cognito [ListUsers API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html)，其接受 **Filter** 參數。

您可以搜尋下列任何標準屬性。無法搜尋自訂屬性。
+ username (區分大小寫)
+ email
+ phone\$1number
+ name
+ given\$1name
+ family\$1name
+ preferred\$1username
+ cognito:user\$1status (在主控台中稱為 **Status (狀態)**、區分大小寫)
+ status (在主控台中稱為 **Enabled (已啟用)**、區分大小寫)
+ sub

**注意**  
您也可以使用用戶端篩選條件列出使用者。與伺服器端篩選條件相符的屬性不超過 1 個。若要執行進階搜尋，請將用戶端篩選條件與 AWS Command Line Interface中的 `list-users` 動作 `--query` 參數搭配使用。當您使用用戶端篩選條件時，ListUsers 會傳回零個或多個使用者的分頁清單。您可以連續接收多個結果為零的頁面。使用傳回的每個分頁權杖重複查詢，直到您收到空分頁權杖值為止，然後檢閱合併的結果。  
如需伺服器端和用戶端篩選的詳細資訊，請參閱 AWS Command Line Interface 《 使用者指南》中的[篩選 AWS CLI 輸出](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html)。

## 使用 搜尋使用者 AWS 管理主控台
<a name="cognito-user-pools-manage-user-accounts-searching-for-users-using-console"></a>

如果您已經建立使用者集區，即可從 **中的 **Users AWS 管理主控台(使用者) 面板進行搜尋。

AWS 管理主控台 搜尋一律是字首 (「開頭」) 搜尋。

**在 Amazon Cognito 主控台中搜尋使用者**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。系統可能會提示您輸入 AWS 登入資料。

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

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

1. 選擇**使用者**選單，然後在搜尋欄位中輸入使用者名稱。請注意，某些屬性值須區分大小寫 (例如 **Username** (使用者名稱))。

   您也可以透過調整搜尋篩選條件來尋找使用者，將範圍縮小至其他使用者屬性，例如 **Email** (電子郵件)、**Phone number** (電話號碼) 或 **Last name** (姓氏)。

## 使用 `ListUsers` API 來搜尋使用者
<a name="cognito-user-pools-searching-for-users-using-listusers-api"></a>

 若要從您的應用程式搜尋使用者，請使用 Amazon Cognito [ListUsers API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html)。此 API 會使用下列參數：
+  `AttributesToGet`：任何字串陣列，其中每個字串都是要在搜尋結果中，為每個使用者傳回的使用者屬性名稱。若要擷取所有屬性，請勿包含 `AttributesToGet` 參數，或請求其值為常值字串 `null` 的 `AttributesToGet`。
+  `Filter`：格式為「`AttributeName` `Filter-Type` "`AttributeValue`"」的篩選字串。篩選字串中的引號必須使用斜線 (`\`) 字元來逸出。例如 `"family_name = \"Reddy\""`。如果篩選字串是空的，`ListUsers`會傳回使用者集區中的所有使用者。
  +  `AttributeName`：所要搜尋的屬性名稱。您一次只能搜尋一個屬性。
**注意**  
您只能搜尋標準屬性。無法搜尋自訂屬性。這是因為只有已編製索引的屬性可供搜尋，而自訂屬性無法編製索引。
  +  `Filter-Type`：若要搜尋完全相符的項目，請使用 `=`，例如，`given_name = "Jon"`。若要搜尋字首 (「開頭為」) 相符的項目，請使用 `^=`，例如，`given_name ^= "Jon"`。
  +  `AttributeValue`：必須符合為每個使用者的屬性值。
+  `Limit`：所要傳回的使用者數量上限。
+  `PaginationToken`：此權杖可用來從先前的搜尋取得更多結果。Amazon Cognito 將在一小時後讓分頁權杖過期。
+  `UserPoolId`：要對其執行搜尋之使用者集區的使用者集區 ID。

所有搜尋皆區分大小寫。搜尋結果會依 `AttributeName`字串指定的屬性遞增排序。

## 使用 `ListUsers` API 的範例
<a name="cognito-user-pools-searching-for-users-listusers-api-examples"></a>

下列範例會傳回所有使用者，並包含所有屬性。

```
{
    "AttributesToGet": null,
    "Filter": "",
    "Limit": 10,
    "UserPoolId": "us-east-1_samplepool"
}
```

下列範例會傳回電話號碼以 "\$11312" 開頭的所有使用者，並包含所有屬性。

```
{
    "AttributesToGet": null,
    "Filter": "phone_number ^= \"+1312\"",
    "Limit": 10,
    "UserPoolId": "us-east-1_samplepool"
}
```

下列範例會傳回姓氏為 "Reddy" 的前 10 個使用者。針對每個使用者，搜尋結果都會包含使用者的名字、電話號碼和電子郵件地址。如果使用者集區中有超過 10 個相符的使用者，則回應會包含分頁權杖。

```
{
    "AttributesToGet": [
        "given_name", 
        "phone_number", 
        "email"
    ],
    "Filter": "family_name = \"Reddy\"",
    "Limit": 10,
    "UserPoolId": "us-east-1_samplepool"
}
```

如果上述範例傳回分頁權杖，則下列範例會傳回下 10 個符合相同篩選字串的使用者。

```
{
    "AttributesToGet": [
        "given_name", 
        "phone_number", 
        "email"
    ],
    "Filter": "family_name = \"Reddy\"",
    "Limit": 10,
    "PaginationToken": "pagination_token_from_previous_search",
    "UserPoolId": "us-east-1_samplepool"
}
```

# 密碼、帳戶復原和密碼政策
<a name="managing-users-passwords"></a>

登入使用者集區的所有使用者，甚至是[聯合身分使用者](cognito-terms.md#terms-federateduser)，都會將密碼指派給其使用者設定檔。[本機使用者](cognito-terms.md#terms-localuser)和[連結使用者](cognito-terms.md#terms-linkeduser)在登入時必須提供密碼。聯合身分使用者不會使用使用者集區密碼，而是使用其身分提供者 (IdP) 登入。您可以允許使用者重設自己的密碼、以管理員身分重設或變更密碼，以及[設定密碼複雜性和歷史記錄的政策](#user-pool-settings-policies)。

Amazon Cognito 不會以純文字儲存使用者密碼。反之，它會使用使用者特定的 salt 來存放每個使用者密碼的雜湊。因此，您無法從使用者集區中的使用者設定檔擷取現有的密碼。根據最佳實務，請勿將純文字使用者密碼存放在任何地方。當使用者忘記密碼時，執行密碼重設。

## 密碼重設和復原
<a name="user-pool-password-reset-and-recovery"></a>

使用者忘記密碼。您可能希望他們能夠自行重設密碼，或者您可能想要要求管理員為其重設密碼。Amazon Cognito 使用者集區具有兩種模型的選項。本指南的此部分涵蓋使用者集區設定和用於密碼重設的 API 操作。

[ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) API 操作和受管登入選項 **忘記您的密碼？** 會傳送程式碼給使用者，當他們確認擁有正確的程式碼時，讓他們有機會使用 [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) 設定新密碼。這是自助式密碼復原模型。

**復原未驗證的使用者**  
您可以傳送復原訊息給已驗證其電子郵件地址或電話號碼的使用者。如果他們沒有已確認的復原電子郵件或電話，使用者集區管理員可以將其電子郵件地址或電話號碼標記為已驗證。在 Amazon Cognito 主控台中編輯使用者**屬性**，然後選取**將電話號碼標記為已驗證**或**將電子郵件地址標記為已驗證**旁的核取方塊。您也可以在 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) 請求中將 `email_verified`或 `phone_number_verified` 設為 true。對於新使用者，[ResendConfirmationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html) API 操作會將新代碼傳送到其電子郵件地址或電話號碼，他們可以完成自助式確認和驗證。

**以管理員身分重設密碼**  
[AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) 和 [AdminResetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html) API 操作是管理員啟動的密碼重設方法。 會`AdminSetUserPassword`設定暫時或永久密碼，並以與 相同的方式`AdminResetUserPassword`傳送密碼重設碼給使用者`ForgotPassword`。

### 設定密碼重設和復原
<a name="user-pool-password-reset-and-recovery-configure"></a>

Amazon Cognito 會自動從您在主控台中建立使用者集區時所選擇的必要屬性和登入選項中選取您的帳戶復原選項。您可以修改這些預設設定。

使用者偏好的 MFA 方法會影響他們可以用來復原密碼的方法。偏好的 MFA 為電子郵件訊息的使用者無法透過電子郵件接收密碼重設碼。偏好的 MFA 是 SMS 訊息的使用者無法透過 SMS 接收密碼重設碼。

當使用者不符合您偏好的密碼重設方法時，[您的密碼復原](#user-pool-password-reset-and-recovery)設定必須提供替代選項。例如，您的復原機制可能以電子郵件為第一優先，而電子郵件 MFA 可能是使用者集區中的選項。在此情況下，請新增簡訊帳戶復原做為第二個選項，或使用管理 API 操作來重設這些使用者的密碼。

Amazon Cognito 會回應來自沒有有效復原方法且錯誤`InvalidParameterException`回應的使用者的密碼重設請求。

**注意**  
使用者無法在相同的電子郵件地址或電話號碼接收 MFA 和密碼重設代碼。如果他們使用來自 MFA 電子郵件訊息的一次性密碼 (OTPs)，則必須使用 SMS 訊息進行帳戶復原。如果他們使用來自 MFA 簡訊的 OTPs，則必須使用電子郵件訊息進行帳戶復原。在具有 MFA 的使用者集區中，如果使用者有電子郵件地址的屬性，但沒有電話號碼，或是電話號碼，但沒有電子郵件地址，則可能無法完成自助式密碼復原。  
若要防止使用者無法使用此組態在使用者集區中重設密碼的狀態，請視需要設定 `email`和 `phone_number` 屬性。 [使用使用者屬性](user-pool-settings-attributes.md)或者，您可以設定程序，在使用者註冊或管理員建立使用者設定檔時，一律收集和設定這些屬性。當使用者有兩個屬性時，Amazon Cognito 會自動將密碼重設代碼傳送至*不是*使用者 MFA 因素的目的地。

下列程序會在使用者集區中設定自助式帳戶復原。

------
#### [ Configure self-service password reset (API/SDK) ]

`AccountRecoverySetting` 參數是使用者集區參數，可設定使用者在 [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) API 請求中或在受管登入中選取**忘記密碼？**時可用來復原密碼的方法。 `ForgotPassword`會將復原碼傳送至已驗證的電子郵件或已驗證的電話號碼。此復原代碼的有效期限為一小時。當您為使用者集區指定 [AccountRecoverySetting](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AccountRecoverySettingType.html) 時，Amazon Cognito 會根據您設定的優先順序選擇程式碼交付目的地。

當您定義 `AccountRecoverySetting` 且使用者已設定 SMS MFA 時，SMS 將無法用於復原帳戶復原機制。此設定的優先順序取決於`1`最高優先順序。Amazon Cognito 只會將驗證傳送至其中一個指定的方法。下列範例`AccountRecoverySetting`會將電子郵件地址設定為帳戶復原碼的主要目的地，如果使用者沒有電子郵件地址屬性，則會回復為簡訊。

```
"AccountRecoverySetting": { 
   "RecoveryMechanisms": [ 
      { 
         "Name": "verified_email",
         "Priority": 1
      },
      { 
         "Name": "verified_phone_number",
         "Priority": 2
      }
   ]
}
```

此值`admin_only`會關閉自助式帳戶復原，而不是要求使用者聯絡其管理員重設密碼。您無法搭配任何其他帳戶復原機制使用 `admin_only`。下列 e

```
"AccountRecoverySetting": { 
   "RecoveryMechanisms": [ 
      { 
         "Name": "admin_only",
         "Priority": 1
      }
   ]
}
```

如果您未指定 `AccountRecoverySetting`，Amazon Cognito 會先將復原碼傳送至已驗證的電話號碼，如果使用者沒有電話號碼屬性，則會傳送至已驗證的電子郵件地址。

如需 的詳細資訊`AccountRecoverySetting`，請參閱 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 和 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)。

------
#### [ Configure self-service password reset (console) ]

從使用者集區的**登入**功能表設定帳戶復原和密碼重設選項。

**設定使用者帳戶復原**

1. 登入 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。

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

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**登入**選單。尋找**使用者帳戶復原**，然後選擇**編輯**

1. 若要允許使用者重設自己的密碼，請選擇**啟用自助式帳戶復原**。

1. 針對使用者集區傳送給使用者的密碼復原碼，設定交付方法。在**使用者帳戶復原訊息的交付方法**下，選取可用的選項。最佳實務是選擇具有次要傳送訊息方法的選項，例如**電子郵件，如果可用，否則為簡訊**。透過次要交付方法，Amazon Cognito 可以要求使用者使用不同的媒體進行密碼重設，而非 MFA。

1. 選取**儲存變更**。

------

### 忘記密碼行為
<a name="forgot-password"></a>

在指定時段內，我們允許使用者可嘗試 5 到 20 次來要求或輸入密碼重設代碼，這是忘記密碼和確認忘記密碼時可操作的步驟。確切的值取決於與要求相關的風險參數。請注意，此行為可能會有所變更。

## 新增使用者集區密碼要求
<a name="user-pool-settings-policies"></a>

強式、複雜的密碼是使用者集區的安全最佳實務。特別是在開放給網際網路的應用程式，較弱的密碼可能會將使用者的登入資料公開給猜測密碼並嘗試存取資料的系統。密碼越複雜，猜測的難度就越高。Amazon Cognito 為具有安全意識的管理員提供額外的工具，例如[威脅防護](cognito-user-pool-settings-threat-protection.md#cognito-user-pool-settings-threat-protection.title)和 [AWS WAF Web ACLs](user-pool-waf.md#user-pool-waf.title)，但您的密碼政策是使用者目錄安全的核心元素。

Amazon Cognito 使用者集區中本機使用者的密碼不會自動過期。最佳實務是在外部系統中記錄使用者密碼重設的時間、日期和中繼資料。透過密碼存留期的外部日誌，您的應用程式或 Lambda 觸發程序可以查詢使用者的密碼存留期，並在指定期間後要求重設。

您可以設定使用者集區，要求符合安全標準的最低密碼複雜性。複雜密碼的長度下限至少為八個字元。它們還包括大寫、數字和特殊字元的組合。

透過 Essentials 或 Plus 功能層，您也可以設定密碼重複使用的政策。您可以防止使用者將其密碼重設為符合其目前密碼或最多 23 個額外先前密碼的新密碼，最多 24 個。

**設定使用者集區密碼**

1. 建立使用者集區並導覽至**設定安全需求**步驟，或存取現有的使用者集區並導覽至**身分驗證方法**選單。

1. 瀏覽至**密碼政策**。

1. 選擇一個**密碼政策模式**。**Cognito 預設**會使用建議的最低設定值來設定您的使用者集區。您也可以選擇**自訂**密碼政策。

1. 設定**密碼長度下限**。所有使用者都必須使用長度大於或等於此值的密碼來註冊或建立。您可以將此最小值設定為 99，但您的使用者最多可以設定 256 個字元的密碼。

1. 在**密碼要求**下設定密碼複雜性規則。選擇每個使用者密碼中至少要有一個的字元類型 (數字、特殊字元、大寫字母和小寫字母)。

   您可以在密碼中至少要求下列其中一個字元。在 Amazon Cognito 驗證密碼是否包含最低必要字元之後，您使用者的密碼可以包含任何類型的其他字元，最長可達密碼長度上限。
   + 大小寫的[基本拉丁語](https://en.wikipedia.org/wiki/ISO_basic_Latin_alphabet)字母
   + 數字
   + 下列特殊字元。

     ```
     ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~ ` = + - 
     ```
   + 非位於開頭及結尾的空格字元。

1. 為**管理員設定的臨時密碼過期時間**設定一個值。在此期限後，您在 Amazon Cognito 主控台或使用 `AdminCreateUser` 建立的新使用者將無法登入並設定新密碼。當他們用臨時密碼登入後，其使用者帳戶就永遠不會過期。若要更新 Amazon Cognito 使用者集區 API 密碼的持續時間，請在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 請求中設定 [TemporaryPasswordValidityDays](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_PasswordPolicyType.html#CognitoUserPools-Type-PasswordPolicyType-TemporaryPasswordValidityDays) 的值。

1. 如果可用，請設定**防止使用先前密碼**的值。若要使用此功能，請在使用者集區中選擇 Essentials 或 Plus [功能層](cognito-sign-in-feature-plans.md)。此參數的值是當使用者重設密碼時，防止新密碼相符的先前密碼數目。

若要重設過期使用者帳戶的存取權，請執行下列其中一項操作：
+ 傳送新的臨時密碼，並使用已`MessageAction`設定為 的 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) API 請求重設過期期間`RESEND`。
+ 刪除使用者描述檔並建立新的描述檔。
+ 在 [AdminResetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html) API 請求中產生新的確認碼。

# 將使用者匯入使用者集區
<a name="cognito-user-pools-import-users"></a>

有兩種方式可以將使用者從現有使用者目錄或使用者資料庫匯入或遷移至 Amazon Cognito 使用者集區。您可以在使用者第一次使用 Amazon Cognito 透過使用者遷移 Lambda 觸發器登入時，來遷移使用者。透過此方法，使用者可以繼續使用他們現有的密碼，且在遷移到您的使用者集區後，不需要重設這些密碼。或者，您可以透過上傳包含所有使用者之使用者描述檔內容的 CSV 檔來大量遷移使用者。下列章節將說明這些方法。

**其他資源**
+ [將使用者遷移至 Amazon Cognito 使用者集區的方法](https://aws.amazon.com/blogs/security/approaches-for-migrating-users-to-amazon-cognito-user-pools/)
+ [AWS re：Inforce 2023 - 遷移至 Amazon Cognito](https://www.youtube.com/watch?v=OkDj9uXWwCc)

**Topics**
+ [透過使用者遷移 Lambda 觸發程序匯入使用者](cognito-user-pools-import-using-lambda.md)
+ [從 CSV 檔案將使用者匯入使用者集區](cognito-user-pools-using-import-tool.md)

# 透過使用者遷移 Lambda 觸發程序匯入使用者
<a name="cognito-user-pools-import-using-lambda"></a>

有了此方法，當使用者首次使用您的應用程式登入或請求重設密碼時，您可以將使用者從現有使用者目錄無縫遷移至使用者集區。新增 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) 功能到您的使用者集區，便會接收有關嘗試登入的使用者其相關中繼資料，並從外部身分來源傳回使用者描述檔資訊。如需此 Lambda 觸發程序範例程式碼的詳細資訊，包括請求和回應參數，請參閱[遷移使用者 Lambda 觸發程序參數](user-pool-lambda-migrate-user.md#cognito-user-pools-lambda-trigger-syntax-user-migration)。

開始遷移使用者前，請在您的 AWS 帳戶帳戶中建立使用者遷移 Lambda 函數，並將 Lambda 函數設定為使用者集區中的使用者遷移觸發程序。向您的 Lambda 函數新增授權政策，該政策僅允許 Amazon Cognito 服務帳戶主體 `cognito-idp.amazonaws.com` 叫用 Lambda 函數，且僅在您自己的使用者集區內容中。如需詳細資訊，請參閱[針對 AWS Lambda 使用以資源為基礎的政策 (Lambda 函數政策)](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)。

**登入程序**

1. 使用者會開啟您的應用程式，並使用 Amazon Cognito 使用者集區 API 或透過受管登入來登入。如需有關如何使用 Amazon Cognito API 簡化登入的詳細資訊，請參閱 [將 Amazon Cognito 身分驗證和授權與 Web 和行動應用程式整合](cognito-integrate-apps.md)。

1. 您的應用程式會將使用者名稱與密碼傳送到 Amazon Cognito。如果您的應用程式具有您使用 AWS SDK 建置的自訂登入 UI，您的應用程式必須搭配 或 `ADMIN_USER_PASSWORD_AUTH`流程使用 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) `USER_PASSWORD_AUTH`或 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)。當您的應用程式使用這些流程之一時，開發套件會將密碼發送到伺服器。
**注意**  
在您新增使用者遷移觸發程序之前，請先啟用您應用程式用戶端設定中的 `USER_PASSWORD_AUTH` 或 `ADMIN_USER_PASSWORD_AUTH`。您必須使用這些流程，而不是預設的 `USER_SRP_AUTH` 流程。Amazon Cognito 必須向您的 Lambda 函數傳送密碼，以便它能夠驗證您的使用者在其他目錄中的身分驗證。SRP 會從您的 Lambda 函數中隱藏您使用者的密碼。

1. Amazon Cognito 會檢查提交的使用者名稱是否與使用者集區中的使用者名稱或別名相符。您可以將使用者的電子郵件地址、電話號碼或偏好的使用者名稱設定為使用者集區中的別名。如果使用者不存在，Amazon Cognito 會將包含使用者名稱和密碼的參數傳送到您的 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) 函數。

1. 您的 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) 函數會使用現有的使用者目錄或使用者資料庫，來檢查使用者或驗證其身分。該函數會傳回 Amazon Cognito 存放在使用者集區中使用者描述檔的使用者屬性。只有在已提交的使用者名稱符合別名屬性時，您才能傳回 `username` 參數。如果您想要使用者繼續使用現有的密碼，您的函數會將 Lambda 回應中的屬性 `finalUserStatus` 設定為 `CONFIRMED`。您的應用程式必須傳回在 [遷移使用者 Lambda 觸發程序參數](user-pool-lambda-migrate-user.md#cognito-user-pools-lambda-trigger-syntax-user-migration) 顯示的所有`"response"` 參數。
**重要**  
請勿在使用者遷移 Lambda 程式碼中記錄整個請求事件物件。此請求事件物件包含使用者的密碼。如果您未清理日誌，密碼會出現在 CloudWatch Logs 中。

1. Amazon Cognito 在您的使用者集區中建立使用者描述檔，並將字符傳回到您的應用程式用戶端。

1. 您的應用程式會執行權杖擷取、接受使用者身分驗證，並繼續處理請求的內容。

遷移使用者後，請使用 `USER_SRP_AUTH` 登入。安全遠端密碼 (SRP) 通訊協定不會透過網路傳送密碼，但會提供您在遷移期間所使用 `USER_PASSWORD_AUTH` 流程的安全優勢。

遷移期間如果發生錯誤，包括用戶端裝置或網路問題，您的應用程式會收到來自 Amazon Cognito 使用者集區 API 的錯誤回應。發生這種情況時，Amazon Cognito 可能會或不會在您的使用者集區中建立使用者帳戶。然後，使用者應嘗試再次登入。如果重複發生登入失敗，請嘗試使用您應用程式的忘記密碼流程重設使用者密碼。

忘記密碼流程還會叫用您的 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) 函數與 `UserMigration_ForgotPassword` 事件來源。由於使用者在請求重設密碼時未提交密碼，因此 Amazon Cognito 在傳送給 Lambda 函數的事件中不會包含密碼。您的函數只能查閱在現有使用者目錄中的使用者，並傳回屬性以新增至使用者集區中的使用者描述檔。在您的函數完成其調用並將回應傳回 Amazon Cognito 之後，您的使用者集區就會透過電子郵件或簡訊傳送密碼重設代碼。在您的應用程式中，提示使用者輸入確認碼和新密碼，然後在 [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) API 請求中將該資訊傳送至 Amazon Cognito。您也可以將內建頁面用於受管登入中的忘記密碼流程。

**其他資源**
+ [將使用者遷移至 Amazon Cognito 使用者集區的方法](https://aws.amazon.com/blogs/security/approaches-for-migrating-users-to-amazon-cognito-user-pools/)

# 從 CSV 檔案將使用者匯入使用者集區
<a name="cognito-user-pools-using-import-tool"></a>

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

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

從 CSV 匯入使用者的最簡單方法是在您的使用者集區中啟用[無密碼登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)。透過電子郵件地址和電話號碼屬性以及正確的使用者集區組態，使用者可以在匯入任務完成後，立即使用電子郵件或簡訊一次性密碼 (OTPs) 登入。如需詳細資訊，請參閱[需要匯入的使用者重設密碼](#cognito-user-pools-using-import-tool-password-reset)。

您也可以使用將 `Permanent` 參數設定為 的 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) API 請求來設定使用者的密碼`true`。CSV 匯入不會計入使用者集區中的每月計費作用中使用者 MAUs)。不過，密碼重設操作會產生 MAUs。若要在匯入具有密碼但未立即作用中的大量使用者時管理成本，請設定您的應用程式，在使用者登入並收到`RESET_REQUIRED`挑戰時提示他們輸入新密碼。

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

**建立使用者匯入任務的步驟**

1. 在 AWS Identity and Access Management (IAM) 主控台中建立 Amazon CloudWatch Logs 角色。

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

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

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

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

1. 使用 CloudWatch 來檢查事件日誌。

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

**其他資源**
+ [Cognito 使用者設定檔匯出參考架構](https://aws.amazon.com/solutions/implementations/cognito-user-profiles-export-reference-architecture/)，用於在使用者集區之間匯出使用者帳戶

**Topics**
+ [建立 CloudWatch Logs IAM 角色](#cognito-user-pools-using-import-tool-cli-cloudwatch-iam-role)
+ [建立使用者匯入 CSV 檔案](#cognito-user-pools-using-import-tool-csv-header)
+ [建立及執行 Amazon Cognito 使用者集區匯入任務](#cognito-user-pools-creating-import-job)
+ [在 CloudWatch 主控台中檢視使用者集區匯入結果](#cognito-user-pools-using-import-tool-cloudwatch)
+ [需要匯入的使用者重設密碼](#cognito-user-pools-using-import-tool-password-reset)

## 建立 CloudWatch Logs IAM 角色
<a name="cognito-user-pools-using-import-tool-cli-cloudwatch-iam-role"></a>

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

**注意**  
在 Amazon Cognito 主控台中建立匯入任務時，可以同時建立 IAM 角色。當您選擇 **Create a new IAM role** (建立新的 IAM 角色) 時，Amazon Cognito 會自動將適當的信任政策和 IAM 政策套用至該角色。

**建立 CloudWatch Logs IAM 角色以進行使用者集區匯入 (AWS CLI、API)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 為 建立新的 IAM 角色 AWS 服務。如需進一步說明，請參閱 *AWS Identity and Access Management 使用者指南*中的[為 AWS 服務建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)。

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

   1. 在 **Add permissions** (新增許可) 畫面中，選擇 **Create policy** (建立政策)，然後插入下列政策陳述式。將 *REGION* 取代為使用者集 AWS 區域 區的 ，例如 `us-east-1`。使用您的 AWS 帳戶 ID 取代 *ACCOUNT*，例如 `111122223333`。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "logs:CreateLogGroup",
                      "logs:CreateLogStream",
                      "logs:DescribeLogStreams",
                      "logs:PutLogEvents"
                  ],
                  "Resource": [
                      "arn:aws:logs:us-east-1:111122223333:log-group:/aws/cognito/*"
                  ]
              }
          ]
      }
      ```

------

1. 由於您在建立角色時並未選擇 Amazon Cognito 做為受信任的實體，您現在必須手動編輯角色的信任關係。在 IAM 主控台的導覽窗格中，選擇 **Roles** (角色)，然後選擇建立的新角色。

1. 選擇**信任關係**標籤。

1. 選擇**編輯信任政策**。

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

------
#### [ JSON ]

****  

   ```
   {
           "Version":"2012-10-17",		 	 	 
           "Statement": [
               {
                   "Effect": "Allow",
                   "Principal": {
                       "Service": "cognito-idp.amazonaws.com"
                   },
                   "Action": "sts:AssumeRole"
               }
           ]
       }
   ```

------

1. 選擇**更新政策**。

1. 請記下 角色 ARN。當您建立匯入任務時，將需要提供此 ARN。

## 建立使用者匯入 CSV 檔案
<a name="cognito-user-pools-using-import-tool-csv-header"></a>

您必須先建立包含欲匯入使用者及其屬性的逗號分隔值 (CSV) 檔案，才能將現有使用者匯入使用者集區。從您的使用者集區中，您可以擷取含有反映使用者集區屬性結構描述之標頭的使用者匯入檔案。然後，您可以插入符合 [格式化 CSV 檔案](#cognito-user-pools-using-import-tool-formatting-csv-file) 中格式化需求的使用者資訊。

### 下載 CSV 檔案標頭 (主控台)
<a name="cognito-user-pools-using-import-tool-downloading-csv-header-console"></a>

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

**若要下載 CSV 檔案標頭**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。系統可能會提示您輸入 AWS 登入資料。

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

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

1. 選擇**使用者**選單。

1. 在 **Import users** (匯入使用者) 區段，選擇 **Create an import job** (建立匯入任務)。

1. 在 **Upload CSV** (上傳 CSV) 之下，選取 *template.csv* 連結並下載 CSV 檔案。

### 下載 CSV 檔案標頭 (AWS CLI)
<a name="cognito-user-pools-using-import-tool-downloading-csv-header-using-cli"></a>

若要取得正確標頭的清單，請從**匯入**使用者下的使用者**功能表中**，選取**建立匯入任務**。在下列對話方塊中，選取`template.csv`連結以下載具有使用者集區屬性的範本檔案。

您也可以執行下列 CLI 命令，其中 *USER\$1POOL\$1ID* 是您要匯入使用者的使用者集區的使用者集區識別符：

```
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 檔案
<a name="cognito-user-pools-using-import-tool-formatting-csv-file"></a>

 下載的使用者匯入 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 檔案，以使其包含此標頭以及使用者的屬性值，並依照下列規則將其格式化：

**注意**  
如需屬性值的詳細資訊，例如電話號碼的適當格式，請參閱[使用使用者屬性](user-pool-settings-attributes.md)。
+ 檔案中的第一列是所下載的標頭列，其中包含使用者屬性名稱。
+ CSV 檔案中的直欄順序不重要。
+ 第一列之後的每一列各包含一個使用者的屬性值。
+ 標頭中的所有直欄都必須存在，但不需要在每個直欄中提供值。
+ 以下是必要屬性：
  + **cognito:username**
  + **email\$1verified** 或 **phone\$1number\$1verified**
    + 每個使用者必須至少有其中一個自動驗證屬性為 `true`。自動驗證屬性是當新使用者加入您的使用者集區時，Amazon Cognito 自動傳送代碼的電子郵件地址或電話號碼。
    + 使用者集區必須至少有一個自動驗證的屬性，可以是 **email\$1verified** 或 **phone\$1number\$1verified**。如果使用者集區沒有自動驗證屬性，匯入任務將不會啟動。
    + 如果使用者集區只有一個自動驗證屬性，則必須為每個使用者驗證該屬性。例如，如果使用者集區只有 **phone\$1number** 是自動驗證屬性，則每個使用者的 **phone\$1number\$1verified** 值必須為 `true`。
**注意**  
為了讓使用者能夠重設密碼，他們必須要有已驗證的電子郵件或電話號碼。Amazon Cognito 會將包含重設密碼代碼的訊息傳送至 CSV 檔案中指定的電子郵件或電話號碼。如果訊息是傳送到電話號碼，則是透過 SMS 訊息傳送。如需詳細資訊，請參閱[註冊時驗證聯絡資訊](signing-up-users-in-your-app.md#allowing-users-to-sign-up-and-confirm-themselves)。
  + **email** (如果 **email\$1verified** 為 `true`)
  + **phone\$1number** (如果 **phone\$1number\$1verified** 為 `true`)
  + 在您建立使用者集區時標記為必要的任何屬性
+ 字串形式的屬性值*不能*用引號括住。
+ 如果屬性值包含逗號，您必須在逗號前面放置斜線 (\$1)。這是因為 CSV 檔案中的欄位是以逗號分隔。
+ CSV 檔案內容應該是沒有位元組順序標記的 UTF-8 格式。
+ **cognito:username** 是必要欄位，並且在您的使用者集區中必須是唯一的。它可以是任何 Unicode 字串，但是不能包含空格或 Tab。
+ 如果有 **birthdate** 值，其格式必須為 **mm/dd/yyyy**。這表示，例如生日是 1985 年 2 月 1 日，則必須編碼為 **02/01/1985**。
+ **cognito：mfa\$1enabled** 欄位必須符合使用者集區的 MFA 要求。如果您已將使用者集區中的多重要素驗證 (MFA) 設定為必要，則所有使用者的此欄位都必須為 `true`或空白。如果您已將 MFA 設定為關閉，則所有使用者的此欄位都必須為 `false`或空白。空白值會將匯入使用者的啟用 MFA 狀態設定為使用者集區所需的狀態。無論您是否設定`cognito:mfa_enabled`值，都可以在沒有有效 MFA 因素的情況下，在 MFA 要求的使用者集區中匯入使用者。此狀態的使用者已啟用 MFA，但在設定電子郵件屬性、電話號碼屬性或 TOTP 之前無法登入，且該組態是您使用者集區中的有效 MFA 因素。
+ 列的長度上限為 16,000 個字元。
+ CSV 檔案大小上限為 100 MB。
+ 檔案中的列數 (使用者數) 上限為 500,000。此上限不包括標題列。
+ **updated\$1at** 欄位值應該是 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 使用者集區匯入任務
<a name="cognito-user-pools-creating-import-job"></a>

本節說明如何使用 Amazon Cognito 主控台和 AWS Command Line Interface () 來建立和執行使用者集區匯入任務AWS CLI。

**Topics**
+ [從 CSV 檔案匯入使用者 (主控台)](#cognito-user-pools-using-import-tool-console)
+ [匯入使用者 (AWS CLI)](#cognito-user-pools-using-import-tool-cli)

### 從 CSV 檔案匯入使用者 (主控台)
<a name="cognito-user-pools-using-import-tool-console"></a>

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

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

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。系統可能會提示您輸入 AWS 登入資料。

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

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

1. 選擇**使用者**選單。

1. 在 **Import users** (匯入使用者) 區段，選擇 **Create an import job** (建立匯入任務)。

1. 在 **Create import job** (建立匯入任務) 頁面上，輸入 **Job name** (任務名稱)。

1. 選擇**Create a new IAM role** (建立新的 IAM 角色)，或 **Use an existing IAM role** (使用現有的 IAM 角色)。

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

   1. 如果您選擇 **Use an existing IAM role** (使用現有的 IAM 角色)，請從 **IAM role selection** (IAM 角色選擇) 下的清單中選擇角色。此角色必須具有 [建立 CloudWatch Logs IAM 角色](#cognito-user-pools-using-import-tool-cli-cloudwatch-iam-role) 中所述的許可和信任政策。

1. 在**上傳 CSV** 下，選擇**選擇檔案**並連接您準備的 CSV 檔案。

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

1. 如果您已建立任務但尚未開始，可以稍後再開始。在**匯入使用者**下方的**使用者**選單中，選擇您的匯入任務，然後選取**開始**。您也可以從 AWS SDK 提交 [StartUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StartUserImportJob.html) API 請求。

1. 在匯入使用者下的 **使用者** 選單中監控使用者**匯入**任務的進度。如果任務未成功，您可以選取 **Status** (狀態) 值。如需其他詳細資訊，請選取 **View the CloudWatch logs for more details** (檢視 CloudWatch 日誌以取得更多詳細資訊)，並在 CloudWatch Logs 主控台中檢視任何問題。

### 匯入使用者 (AWS CLI)
<a name="cognito-user-pools-using-import-tool-cli"></a>

下列 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
```

#### 建立使用者匯入任務
<a name="cognito-user-pools-using-import-tool-cli-creating-user-import-job"></a>

在您建立 CSV 檔案之後，請執行下列 CLI 命令來建立使用者匯入任務，其中 *JOB\$1NAME* 是您為任務選擇的名稱，*USER\$1POOL\$1ID* 是新使用者會新增至其中的使用者集區 ID，而 *ROLE\$1ARN* 是您在 [建立 CloudWatch Logs IAM 角色](#cognito-user-pools-using-import-tool-cli-cloudwatch-iam-role) 中收到的角色 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\$1SIGNED\$1URL* 有效時間為 15 分鐘。之後就會過期，而您必須建立新的使用者匯入任務來取得新的 URL。

**Example 回應：**  

```
{
    "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
    }
}
```

#### 使用者匯入任務的狀態值
<a name="cognito-user-pools-using-import-tool-cli-status-values-for-user-import-job"></a>

在對使用者匯入命令的回應中，您會看到下列其中一個 `Status`值：
+ `Created` – 任務已建立但未啟動。
+ `Pending` – 轉換狀態。您已啟動任務，但它尚未開始匯入使用者。
+ `InProgress` – 任務已啟動，並且正在匯入使用者。
+ `Stopping` – 您已停止任務，但該任務尚未停止匯入使用者。
+ `Stopped` – 您已停止任務，且該任務已停止匯入使用者。
+ `Succeeded` – 任務已成功完成。
+ `Failed` – 由於發生錯誤，任務已停止。
+ `Expired` – 您已建立任務，但未於 24 到 48 小時內啟動任務。與任務相關聯的所有資料都已刪除，無法啟動任務。

#### 上傳 CSV 檔案
<a name="cognito-user-pools-using-import-tool-cli-uploading-csv-file"></a>

您可以使用下列 `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 檔案。

#### 描述使用者匯入任務
<a name="cognito-user-pools-using-import-tool-cli-describing-user-import-job"></a>

若要取得使用者匯入任務的描述，請使用下列命令，其中 *USER\$1POOL\$1ID* 是您的使用者集區 ID，而 *JOB\$1ID* 是您建立使用者匯入任務時所傳回的任務 ID。

```
aws cognito-idp describe-user-import-job --user-pool-id "USER_POOL_ID" --job-id "JOB_ID"
```

**Example 回應範例：**  

```
{
    "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\$1SIGNED\$1URL* 是您上傳 CSV 檔案的 URL。*ROLE\$1ARN* 是您建立角色時，所收到的 CloudWatch Logs 角色 ARN。

#### 列出您的使用者匯入任務
<a name="cognito-user-pools-using-import-tool-cli-listing-user-import-jobs"></a>

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

```
aws cognito-idp list-user-import-jobs --user-pool-id "USER_POOL_ID" --max-results 2
```

**Example 回應範例：**  

```
{
    "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\$1TOKEN* 字串表示此列出命令還有其他結果。若要列出其他結果，請使用 `--pagination-token`選項，如下所示：

```
aws cognito-idp list-user-import-jobs --user-pool-id "USER_POOL_ID" --max-results 10 --pagination-token "PAGINATION_TOKEN"
```

#### 啟動使用者匯入任務
<a name="cognito-user-pools-using-import-tool-cli-starting-user-import-job"></a>

若要啟動使用者匯入任務，請使用下列命令：

```
aws cognito-idp start-user-import-job --user-pool-id "USER_POOL_ID" --job-id "JOB_ID"
```

每個帳戶一次只能有一個匯入任務處於作用中狀態。

**Example 回應範例：**  

```
{
    "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
    }
}
```

#### 停止使用者匯入任務
<a name="cognito-user-pools-using-import-tool-cli-stopping-user-import-job"></a>

若要在使用者匯入任務進行時將其停止，請使用下列命令。停止任務後，就無法再重新啟動。

```
aws cognito-idp stop-user-import-job --user-pool-id "USER_POOL_ID" --job-id "JOB_ID"
```

**Example 回應範例：**  

```
{
    "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 主控台中檢視使用者集區匯入結果
<a name="cognito-user-pools-using-import-tool-cloudwatch"></a>

您可以在 Amazon CloudWatch 主控台中檢視匯入任務的結果。

**Topics**
+ [檢視結果](#cognito-user-pools-using-import-tool-viewing-the-results)
+ [解譯結果](#cognito-user-pools-using-import-tool-interpreting-the-results)

### 檢視結果
<a name="cognito-user-pools-using-import-tool-viewing-the-results"></a>

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

**檢視使用者集區匯入的結果**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 選擇 **Logs** (日誌)。

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

1. 選擇您剛才執行的使用者匯入任務的日誌。日誌名稱的格式為 *JOB\$1ID*/*JOB\$1NAME*。日誌中的結果會依行號參照您的使用者。使用者資料不會寫入日誌中。針對每個使用者，會顯示類似下列字行：
   + `[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).`

### 解譯結果
<a name="cognito-user-pools-using-import-tool-interpreting-the-results"></a>

成功匯入的使用者狀態會設為 "PasswordReset"。

在下列情況下，將不會匯入使用者，但匯入任務會繼續：
+ 沒有自動驗證屬性設為 `true`。
+ 使用者資料不符合結構描述。
+ 因為內部錯誤，無法匯入使用者。

在下列情況下，匯入任務會失敗：
+ Amazon CloudWatch Logs 角色無法擔任、沒有正確的存取政策或已刪除。
+ 使用者集區已刪除。
+ Amazon Cognito 無法剖析 .csv 檔案。

## 需要匯入的使用者重設密碼
<a name="cognito-user-pools-using-import-tool-password-reset"></a>

如果您的使用者集區只提供以密碼為基礎的登入，使用者必須在匯入後重設密碼。第一次登入時，他們可以輸入*任何*密碼。Amazon Cognito 會提示他們在 API 回應中輸入來自您應用程式的登入請求中輸入新密碼。

如果您的使用者集區具有無密碼身分驗證因素，Amazon Cognito 會預設為匯入使用者的身分驗證因素。系統不會提示他們輸入新密碼，而且可以立即使用無密碼電子郵件或 SMS OTP 登入。您也可以提示使用者設定密碼，讓他們可以完成其他登入方法，例如 username-password 和 passkey。下列條件適用於使用者匯入後的無密碼登入。

1. 您必須匯入具有對應至可用無密碼登入因素之屬性的使用者。如果使用者可以使用電子郵件地址登入，您必須匯入 `email` 屬性。如果是電話號碼，您必須匯入`phone_number`屬性。如果兩者皆是，請匯入任一屬性的值。

1. 一般而言，使用者匯入`RESET_REQUIRED`的狀態必須重設密碼。如果他們能夠使用無密碼因素登入，Amazon Cognito 會將他們的狀態設定為 `CONFIRMED`。

如需無密碼身分驗證的詳細資訊，包括如何設定以及如何在應用程式中建構身分驗證流程，請參閱 [使用 Amazon Cognito 使用者集區進行身分驗證](authentication.md)。

下列程序說明在您匯入 CSV 檔案`RESET_REQUIRED`後， 中具有本機使用者的自訂登入機制使用者體驗。如果您的使用者使用受管登入登入，請指示他們選取**忘記密碼？**選項、提供電子郵件或文字訊息中的代碼，並設定密碼。

**需要匯入的使用者重設密碼**

1. 在您的應用程式中，使用隨機密碼透過 `InitiateAuth` 默默地登入目前使用者。

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

1. 您的應用程序發出 `ForgotPassword` API 請求並重設使用者的密碼。

   1. 應用程式在 `ForgotPassword` API 請求中提交使用者名稱。

   1. Amazon Cognito 會將代碼傳送至已驗證的電子郵件或電話號碼。目的地取決於您在 CSV 檔案中為 `email_verified` 和 `phone_number_verified` 提供的值。對 `ForgotPassword` 請求的回應指示代碼的目的地。
**注意**  
您的使用者集區必須經過設定，以驗證電子郵件或電話號碼。如需詳細資訊，請參閱[註冊及確認使用者帳戶](signing-up-users-in-your-app.md)。

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

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

   1. 應用程式在 `ConfirmForgotPassword` API 請求中提交代碼和新密碼。

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

# 使用使用者屬性
<a name="user-pool-settings-attributes"></a>

屬性是協助您識別個別使用者的細項資訊，例如名稱、電子郵件地址和電話號碼。新使用者集區具有一組預設的*標準屬性*。您也可以在 中將自訂屬性新增至使用者集區定義 AWS 管理主控台。此主題會詳細說明那些屬性，並提供設定使用者集區的秘訣。

請勿將所有的使用者相關資訊都存放在屬性中。例如，將經常變更的使用者資料，例如用量統計資料或遊戲分數，保存在個別的資料存放區中，例如 Amazon Cognito Sync 或 Amazon DynamoDB。

請先清理使用者屬性字串值的輸入，再將其提交至使用者集區。分析提議使用者屬性值的一種方法是使用 Lambda 觸發程序，例如[註冊前](user-pool-lambda-pre-sign-up.md)。

**注意**  
某些文件和標準將屬性稱為*成員*。

**Topics**
+ [標準屬性](#cognito-user-pools-standard-attributes)
+ [使用者名稱和偏好的使用者名稱](#user-pool-settings-usernames)
+ [自訂登入屬性](#user-pool-settings-aliases)
+ [自訂屬性](#user-pool-settings-custom-attributes)
+ [屬性許可和範圍](#user-pool-settings-attribute-permissions-and-scopes)

## 標準屬性
<a name="cognito-user-pools-standard-attributes"></a>

Amazon Cognito 會根據 [OpenID Connect 規格](http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)為所有使用者指派一組標準屬性。根據預設，標準和自訂屬性值可以是長度上限 2048 個字元的任何字串，但某些屬性值有格式限制。

標準屬性包括：
+ `name`
+ `family_name`
+ `given_name`
+ `middle_name`
+ `nickname`
+ `preferred_username`
+ `profile`
+ `picture`
+ `website`
+ `gender`
+ `birthdate`
+ `zoneinfo`
+ `locale`
+ `updated_at`
+ `address`
+ `email`
+ `phone_number`
+ `sub`

除了 `sub`，所有使用者的標準屬性預設都是選用的。若要設定為必要屬性，請在使用者集區建立程序期間，勾選屬性旁邊的 **Required** (必要) 核取方塊。Amazon Cognito 會為每個使用者的 `sub` 屬性指派唯一的使用者識別碼值。只有 **email** 和 **phone\$1number** 屬性能夠驗證。

標準屬性具有預先定義的屬性，您可以在 [DescribeUserPool API 回應](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPool.html#API_DescribeUserPool_ResponseSyntax)的 `SchemaAttributes` 參數中檢視這些屬性。您可以為這些屬性屬性設定自訂值，例如資料類型、可變性和長度限制。若要修改標準屬性屬性，請在 [CreateUserPool 結構描述參數](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-Schema)中設定其自訂值。結構描述也是您設定必要屬性的位置。當您在 Amazon Cognito 主控台中建立使用者集區時，您無法修改標準屬性的屬性。

**注意**  
 將標準屬性標示為 **Required (必要)** 後，使用者必須提供該屬性的值，才能註冊。若要建立使用者而不為所需屬性提供值，管理員可以使用 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html) API。建立使用者集區之後，您便無法讓屬性在必要和非必要之間切換。標準屬性詳細資訊和格式限制

**birthdate**  
值必須是 10 個字元的有效日期，且格式為 YYYY-MM-DD。

**email**  
使用者和管理員可以驗證電子郵件地址值。  
具有適當 AWS 帳戶 許可的管理員可以變更使用者的電子郵件地址，並將其標記為已驗證。使用 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 或 [admin-update-user-attributes](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-update-user-attributes.html) AWS Command Line Interface (AWS CLI) 命令將電子郵件地址標記為已驗證。管理員可以使用此命令將 `email_verified` 屬性變更為 `true`。您也可以在 Amazon Cognito 主控台**的使用者**選單中編輯使用者，將電子郵件地址標記為已驗證。  
值必須是符合 @ 符號和網域的標準電子郵件格式[的有效電子郵件地址字串](https://datatracker.ietf.org/doc/html/rfc3696#section-3)，長度上限為 2048 個字元。

**phone\$1number**  
如果 SMS 多重要素驗證 (MFA) 處於作用中狀態，則使用者必須提供電話號碼。如需詳細資訊，請參閱[將 MFA 新增到使用者集區](user-pool-settings-mfa.md)。  
使用者和管理員可以驗證電話號碼值。  
具有適當 AWS 帳戶 許可的管理員可以變更使用者的電話號碼，並將其標記為已驗證。使用 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 或 [admin-update-user-attributes](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-update-user-attributes.html) AWS CLI 命令將電話號碼標記為已驗證。管理員可以使用此命令將 `phone_number_verified` 屬性變更為 `true`。您也可以在 Amazon Cognito 主控台**的使用者**選單中編輯使用者，將電話號碼標記為已驗證。  
電話號碼必須遵循下列格式規則：電話號碼必須以加號 (**\$1**) 開頭，後面緊接著國碼。電話號碼只能包含 **\$1** 號和數字。請先移除電話號碼中的任何其他字元，例如括號、空格或連字號 (**-**)，您才能將該值提交至服務。例如，美國地區的電話號碼必須遵循此格式：**\$114325551212**。

**preferred\$1username**  
您可以選取 `preferred_username` 為必填或別名，但不能同時為兩者。如果 `preferred_username` 是別名，在確認使用者後，您可以向 [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html) API 操作請求並新增屬性值。

**sub**  
根據 `sub` 屬性建立索引與搜尋您的使用者。`sub` 屬性是每個使用者集區中的唯一使用者識別碼。使用者可以變更屬性，如 `phone_number` 和 `email`。`sub` 屬性具有固定的值。如需尋找使用者的詳細資訊，請參閱 [管理及搜尋使用者帳戶](how-to-manage-user-accounts.md)。

### 檢視必要的屬性
<a name="how-to-edit-standard-attributes"></a>

使用下列處理程序檢視指定使用者集區的必要屬性。

**注意**  
建立使用者集區之後，您就無法變更必要的屬性。

**檢視必要的屬性**

1. 前往 中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home) AWS 管理主控台。如果主控台提示您，請輸入您的 AWS 登入資料。

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

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

1. 選擇**註冊**功能表。

1. 在 **Required attributes** (必要的屬性) 區段中，檢視使用者集區的必要屬性。

## 使用者名稱和偏好的使用者名稱
<a name="user-pool-settings-usernames"></a>

`username` 值是另一個屬性，不同於 `name` 屬性。每個使用者都有 `username` 屬性。Amazon Cognito 會自動為聯合身分使用者產生使用者名稱。您必須提供 `username` 屬性，以便在 Amazon Cognito 目錄中建立本機使用者。在您建立使用者之後，您無法變更 `username` 屬性。

開發人員可以使用 `preferred_username` 屬性，以提供使用者可以變更的使用者名稱。如需詳細資訊，請參閱[自訂登入屬性](#user-pool-settings-aliases)。

如果您的應用程式不需要使用者名稱，則不需要求使用者提供。您的應用程式可以在背景為使用者建立唯一的使用者名稱。如果您希望使用者以電子郵件地址和密碼來註冊及登入，這會非常有用。如需詳細資訊，請參閱[自訂登入屬性](#user-pool-settings-aliases)。

`username` 在使用者集區中必須是唯一的。`username` 只有在其已遭刪除且不再使用的情況下方可重新使用。如需 `username` 屬性的字串限制的相關資訊，請參閱 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-Username) API 請求的 *username* 屬性。

## 自訂登入屬性
<a name="user-pool-settings-aliases"></a>

建立使用者集區時，如果您希望使用者以電子郵件地址或電話號碼做為使用者名稱進行註冊和登入，可以設定*使用者名稱屬性*。或者，您可以設定別名屬性，為使用者提供選項：他們可以在註冊時包含多個屬性，然後以使用者名稱、偏好的使用者名稱、電子郵件地址或電話號碼登入。

**重要**  
建立使用者集區之後，您就無法變更此設定。

### 如何在別名屬性和使用者名稱屬性之間進行選擇
<a name="user-pool-settings-aliases-settings"></a>


| 您的要求 | 別名屬性 | 使用者名稱屬性 | 
| --- |--- |--- |
| Users have multiple sign-in attributes | Yes¹ | No² | 
| Users must verify email address or phone number before they can sign in with it | Yes | No | 
| Sign up users with duplicate email addresses or phone numbers and prevent UsernameExistsException errors³ | Yes | No | 
| Can assign the same email address or phone number attribute value to more than one user | Yes⁴ | No | 

¹ 可用的登入屬性為使用者名稱、電子郵件地址和偏好的使用者名稱。

² 可以使用電子郵件地址或電話號碼登入。

³ 使用者使用可能重複的電子郵件地址或電話號碼註冊，但沒有使用者名稱時，使用者集區不會產生 `UsernameExistsException` 錯誤。這種行為與**防止使用者名稱存在錯誤**無關，它適用於登入，但不適用於註冊操作。

⁴ 只有最後一位已驗證屬性的使用者才能使用該屬性登入。

#### 選項 1：多個登入屬性 (別名屬性)
<a name="user-pool-settings-aliases-settings-option-1"></a>

當使用者擁有使用者名稱，但也可以使用該屬性登入時，屬性即為*別名*。當您想要允許使用者在登入表單的使用者名稱欄位中選擇其使用者名稱和其他屬性值時，請設定別名。`username` 屬性是使用者無法變更的固定值。如果您將屬性標記為別名，使用者就可以使用該屬性代替使用者名稱來登入。您可以將電子郵件地址、電話號碼和偏好的使用者名稱屬性標記為別名。例如，如果您為使用者集區選擇將電子郵件和電話號碼做為別名，該使用者集區中的使用者就可以使用其使用者名稱、電子郵件地址或電話號碼並搭配其密碼來登入。

若要選擇別名屬性，請在建立使用者集區時選取 **User name** (使用者名稱) 和至少另一個登入選項。

**注意**  
當您將使用者集區設定為不區分大小寫時，使用者可以使用小寫或大寫字母來註冊或使用別名登入。如需詳細資訊，請參閱 *Amazon Cognito 使用者集區 API 參考*中的 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html)。

如果您選取電子郵件地址做為別名，Amazon Cognito 不會接受與有效電子郵件地址格式相符的使用者名稱。同樣地，如果您選擇電話號碼做為別名，Amazon Cognito 不會接受與有效電話號碼格式相符的使用者集區的使用者名稱。

**注意**  
別名值在使用者集區中必須是唯一的。如果您為電子郵件地址或電話號碼設定別名，所提供的值只能在一個帳戶中是已驗證狀態。註冊期間，如果您的使用者提供電子郵件地址或電話號碼做為別名值，而另一個使用者已使用該別名值，則註冊會成功。不過，當使用者嘗試使用此電子郵件 (或電話號碼) 來確認帳戶，並輸入有效的驗證碼時，Amazon Cognito 會傳回 `AliasExistsException` 錯誤。該錯誤會向使用者指出使用此電子郵件地址 (或電話號碼) 的帳戶已存在。此時，使用者可以放棄嘗試建立新帳戶，並改為嘗試為舊帳戶重設密碼。如果使用者繼續建立新帳戶，您的應用程式必須以 `forceAliasCreation` 選項呼叫 `ConfirmSignUp` API。具有 `forceAliasCreation` 的 `ConfirmSignUp` 會將先前的帳戶移到新建立的帳戶，並在先前的帳戶中，將該屬性標記為未驗證。

電話號碼和電子郵件地址只有在經過使用者驗證後，才會成為使用者的作用中別名。如果要使用電子郵件地址和電話號碼做為別名，建議您選擇自動驗證。

選擇別名屬性，以防止使用者註冊時發生電子郵件地址和電話號碼屬性 `UsernameExistsException` 錯誤。

啟用 `preferred_username` 屬性，以便您的使用者可以變更用於登入的使用者名稱，而 `username` 屬性值不會變更。如果您想要設定此使用者體驗，請提交新的 `username`值做為 `preferred_username`，並選擇 `preferred_username` 做為別名。如此一來，使用者就可以使用其輸入的新值來登入。如果您選取 `preferred_username` 做為別名，則使用者只有在確認帳戶後，才能提供該值。使用者在註冊期間無法提供該值。

當使用者以使用者名稱進行註冊時，您可以選擇使用者是否可以使用下列一或多個別名來登入。
+ 已驗證的電子郵件地址
+ 已驗證的電話號碼
+ 偏好的使用者名稱

使用者完成註冊之後，便可以變更這些別名。

**重要**  
在您的使用者集區支援使用別名登入，且您想授權或查詢使用者時，請勿透過使用者的任何登入屬性來識別您的使用者。固定值使用者識別符 `sub` 是使用者身份的唯一一致指標。

當您建立使用者集區時，請包括下列步驟，以便使用者可以使用別名登入。

------
#### [ Phone number or email address (console) ]

建立使用者集區時，您必須將電子郵件地址和電話號碼設定為別名屬性。

**在 Amazon Cognito 主控台中使用使用者名稱別名建立使用者集區**

1. 前往 AWS 管理主控台中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home)。如果主控台提示您，請輸入您的 AWS 登入資料。

1. 使用**開始使用**或建立使用者集區按鈕**建立新的使用者集區**。

1. 在**定義您的**應用程式中選擇應用程式設定。

1. 在**登入識別碼選項**下的**設定選項**中，選取**使用者名稱**旁的核取方塊，以及至少一個其他選項：**電子郵件**和**電話號碼**。

1. 選擇別名屬性做為**註冊的必要屬性**。在受管登入註冊表單中，Amazon Cognito 會提示新使用者提供必要屬性的值。

1. 在**新增傳回 URL** 下，設定受管登入登入後重新導向的應用程式回呼 URL。

1. 選擇**建立**。

------
#### [ Phone number or email address (API/SDK) ]

使用 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) API 操作建立新的使用者集區。設定 `AliasAttributes` 參數，如下所示。如果您只想要電話號碼別名，您可以移除`email`項目，或者如果您只想要電子郵件地址別名，則可以移除`phone_number`項目。

```
"AliasAttributes": [
   "email",
   "phone_number"
],
```

------
#### [ Preferred username (API/SDK) ]

Amazon Cognito 主控台會建立不含 `preferred_username`做為別名的使用者集區。若要使用別名建立使用者集區，請在 AWS SDK `preferred_username` 中使用 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) API 請求設定使用者集區。若要支援在註冊時建立偏好的使用者名稱屬性，請將 `preferred_username`設定為必要的屬性。在受管登入註冊表單中，Amazon Cognito 會提示新使用者提供必要屬性的值。*您可以在* Amazon Cognito 主控台中將 設定為`preferred_username`必要屬性，但這不會將其用作別名。

**將 設定為別名**  
在`CreateUserPool`請求的 `AliasAttributes` 參數中將 `preferred_username`設定為別名，如下所示。從清單中移除您不想做為別名屬性的任何值。

```
"AliasAttributes": [
   "email",
   "phone_number",
   "preferred_username"
],
```

**視需要設定**  
在受管登入註冊表單中，Amazon Cognito 會提示新使用者提供必要屬性的值。在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 請求的 `SchemaAttributes` 參數中`preferred_username`視需要設定 。

若要將偏好的使用者名稱設定為必要的屬性，請如所示進行設定。下列範例會修改 的預設結構描述`preferred_username`，以將其設定為必要。其他結構描述參數，例如 `AttributeDataType`（預設為 `string`) 和 `StringAttributeConstraints`（預設為長度 1-99 個字元） 會假設預設值。

```
"Schema": [
   {
      "Name": "preferred_username",
      "Required": true
   }
]
```

------

#### 選項 2：以電子郵件地址或電話號碼作為登入屬性 (使用者名稱屬性)
<a name="user-pool-settings-aliases-settings-option-2"></a>

當使用者以電子郵件地址或電話號碼做為使用者名稱進行註冊時，您可以選擇使用者是否可以僅使用電子郵件地址、僅電話號碼或兩者之一來註冊。

若要選擇使用者名稱屬性，請勿在建立使用者集區時選取**使用者名稱**做為登入選項。

電子郵件地址或電話號碼必須是唯一的，而且不能是已由其他使用者所使用。這不需要驗證。使用者以電子郵件地址或電話號碼註冊之後，即無法以相同的電子郵件地址或電話號碼來建立新帳戶。使用者只能重複使用現有的帳戶，並依需要重設帳戶密碼。不過，使用者可以將電子郵件地址或電話號碼變更為新的電子郵件地址或電話號碼。如果電子郵件地址或電話號碼尚未使用，就會變成新的使用者名稱。

當您同時選取電子郵件地址和電話號碼做為使用者名稱屬性時，使用者可以使用一個或另一個屬性登入，即使兩者都提供值。登入使用者名稱是根據您在 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-Username) `Username` 參數中傳遞的值。

**注意**  
如果使用者以電子郵件地址做為使用者名稱來註冊，使用者可以將使用者名稱變更為另一個電子郵件地址，但不能將其變更為電話號碼。如果使用者以電話號碼來註冊，則可以將使用者名稱變更為另一個電話號碼，但不能將其變更為電子郵件地址。

在使用者集區建立程序期間使用下列步驟，以設定使用電子郵件地址或電話號碼來註冊及登入。

------
#### [ Username attributes (console) ]

下列程序會建立具有電子郵件地址或電話號碼使用者名稱屬性的使用者集區。Amazon Cognito 主控台中使用者名稱屬性的程序差異在於，您也不會將**使用者名稱**設定為登入屬性。

**在 Amazon Cognito 主控台中建立具有使用者名稱屬性的使用者集區**

1. 前往 AWS 管理主控台中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home)。如果主控台提示您，請輸入您的 AWS 登入資料。

1. 使用**開始使用**或建立使用者集區按鈕**建立新的使用者集區**。

1. 在**定義您的**應用程式中選擇應用程式設定。

1. 在**登入識別碼選項**下的**設定選項**中，選取您的使用者名稱屬性：**電子郵件**、**電話號碼**或兩者。不勾選**使用者名稱**。

1. 最佳實務是，選取您的使用者名稱屬性做為**註冊的必要屬性**。在受管登入註冊表單中，Amazon Cognito 會提示新使用者提供必要屬性的值。如果您未視需要設定使用者名稱屬性，Amazon Cognito 不會提示新使用者為其提供值。在這種情況下，您必須將應用程式設定為收集和提交每個使用者的電子郵件地址或電話號碼，然後才能登入。

1. 在**新增傳回 URL** 下，設定受管登入登入後重新導向的應用程式回呼 URL。

1. 選擇**建立**。

------
#### [ Username attributes (API/SDK) ]

在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 請求中，設定 `UsernameAttributes` 參數，如下所示。若要僅允許使用電子郵件地址使用者名稱登入，請在此清單中`email`單獨指定 。若要僅允許使用電話號碼使用者名稱登入，請`phone_number`單獨指定 。此參數會將使用者名稱覆寫為登入選項。

```
"UsernameAttributes": [ 
   "email",
   "phone_number"
],
```

------

當您設定使用者名稱屬性時，您的 可以發出 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) API 請求，在 `username` 參數中傳遞電子郵件地址或電話號碼。以下是程式碼`SignUp` API 操作與使用者名稱屬性的行為。
+ 如果`username`字串是有效的電子郵件地址格式，例如 `user@example.com`，則使用者集區會自動以 `username`值填入使用者的`email`屬性。
+ 如果`username`字串是有效的電話號碼格式，例如 `+12065551212`，則使用者集區會自動以 `username`值填入使用者的`phone_number`屬性。
+ 如果 `username` 字串格式不是電子郵地址或電話號碼格式，`SignUp` API 會傳回例外狀況。
+ 如果 `username` 字串中包含已使用中的電子郵件地址或電話號碼，`SignUp` API 會傳回例外狀況。
+ `SignUp` API 會使用 [UUID](cognito-terms.md#terms-uuid) 為您的使用者填入`username`屬性。此 UUID 的值與使用者身分字符中的 `sub` 宣告相同。

您可以使用電子郵件地址或電話號碼來取代 [ListUsers](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html) 操作以外的所有 APIs 中的使用者名稱。在 `ListUsers` API 請求中，您可以指定 `email`或 `Filter`的 `phone_number`。如果您依 篩選`username`，則必須提供 UUID 使用者名稱，而不是電子郵件地址或電話號碼。

## 自訂屬性
<a name="user-pool-settings-custom-attributes"></a>

您可以新增最多 50 個自訂屬性到您的使用者集區。您可以指定自訂屬性的長度下限及/或上限。不過，任何自訂屬性的長度上限不能超過 2048 個字元。自訂屬性的名稱必須符合 [SchemaAttributeType](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SchemaAttributeType.html) `Name` 參數中所述的規則表達式模式。

**每個自訂屬性具有下列特性：**
+ 您可以將其定義為字串、數字、布林值或`DateTime`物件。Amazon Cognito 僅將自訂屬性值做為字串寫入 ID 權杖。
**注意**  
在 Amazon Cognito 主控台中，您只能新增字串和數字資料類型的自訂屬性。布林值和`DateTime`屬性資料類型等其他選項僅適用於 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 和 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 請求的 `SchemaAttributes` 屬性。
+ 您不能要求使用者為屬性提供值。
+ 將它新增至使用者集區之後，便無法移除或變更它。
+ 屬性名稱的字元長度在 Amazon Cognito 接受的限制範圍內。如需詳細資訊，請參閱[Amazon Cognito 的配額](quotas.md)。
+ 可以是*可變*或*不可變*。建立使用者時，您只能將值寫入不可變屬性中。如果您的應用程式用戶端對該屬性具有寫入許可，則可以變更可變屬性的值。如需詳細資訊，請參閱[屬性許可和範圍](#user-pool-settings-attribute-permissions-and-scopes)。

**注意**  
在您的程式碼以及 [使用以角色為基礎的存取控制](role-based-access-control.md) 的規則設定中，自訂屬性需要 `custom:` 字首來將其與標準屬性區分。

您也可以在建立使用者集區時，於 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 的 `SchemaAttributes` 屬性中新增*開發人員屬性*。開發人員屬性帶有 `dev:` 字首。您只能使用 AWS 登入資料修改使用者的開發人員屬性。開發人員屬性是舊版功能，Amazon Cognito 已將它取代為應用程式用戶端讀寫許可。

請使用下列處理程序建立新的自訂屬性。

**使用主控台新增自訂屬性**

1. 前往 中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home) AWS 管理主控台。如果主控台提示您，請輸入您的 AWS 登入資料。

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

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

1. 選擇**註冊**功能表，然後在**自訂屬性**區段中，選擇**新增自訂屬性**。

1. 在 **Add custom attributes** (新增自訂屬性) 頁面中，提供下列有關新屬性的詳細資訊：
   + 輸入 **Name** (名稱)。
   + 選取 **Type** (類型) 為 **String** (字串) 或 **Number** (數字)。
   + 輸入 **Min** (最小) 字串長度或數字值。
   + 輸入 **Max** (最大) 字串長度或數字值。
   + 如果您想要許可使用者在設定初始值之後，可以變更自訂屬性的值，請選擇 **Mutable** (可變)。

1. 選擇**儲存變更**。

## 屬性許可和範圍
<a name="user-pool-settings-attribute-permissions-and-scopes"></a>

針對每個應用程式用戶端，您可以設定每個使用者屬性的讀取和寫入許可。透過這種方式，您可以控制任何應用程式所擁有讀取和修改您為使用者所存放每個屬性的存取權。例如，您有一個自訂屬性指出使用者是否為付費客戶。您的應用程式可能可以看到此屬性，但不能直接變更。反之，您會使用管理工具或背景處理程序來更新此屬性。您可以從 Amazon Cognito 主控台、Amazon Cognito API 或 AWS CLI設定使用者屬性的許可。預設情況下，除非您設定自訂屬性的讀取和寫入許可，否則任何新的自訂屬性都無法使用。根據預設，當您建立新的應用程式用戶端時，您會授予應用程式所有標準和自訂屬性的讀取和寫入許可。若要限制應用程式只能擁有所需的資訊量，請在應用程式用戶端組態中指派特定許可給屬性。

最佳實務是在建立應用程式用戶端時指定屬性讀取和寫入許可。授予應用程式用戶端存取應用程式操作所需的最低使用者屬性集。

**注意**  
[DescribeUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPoolClient.html) 只有在您設定非預設值的應用程式用戶端許可時，才會針對 `ReadAttributes` 和 `WriteAttributes` 傳回值。

**若要更新屬性許可 (AWS 管理主控台)**

1. 前往 中的 [Amazon Cognito](https://console.aws.amazon.com/cognito/home) AWS 管理主控台。如果主控台提示您，請輸入您的 AWS 登入資料。

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

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

1. 選擇**應用程式用戶端**選單，然後從清單中選擇應用程式用戶端。

1. 在**屬性許可**索引標籤中，選擇**編輯**。

1. 在 **Edit attribute read and write permissions** (編輯屬性讀取和寫入許可) 頁面設定您的讀取和寫入許可，然後選擇 **Save changes** (儲存變更)。

對使用自訂屬性的每個應用程式用戶端重複以上步驟。

對於每個應用程式用戶端，您可以將屬性標記為可讀或可寫入。同樣適用於標準和自訂屬性。您的應用程式可以擷取標記為可讀取之屬性的值，而且可以設定或修改標記為可寫入之屬性的值。如果您的應用程式嘗試為未授權寫入的屬性設定值，則 Amazon Cognito 會傳回 `NotAuthorizedException`。[GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html) 請求會在應用程式用戶端宣告中包含存取權杖；Amazon Cognito 只會針對您的應用程式用戶端能夠讀取的屬性傳回值。來自應用程式的使用者 ID 權杖僅包含與可讀屬性對應的宣告。所有應用程式用戶端都可以寫入使用者集區所需的屬性。只有在您同時為任何尚未具有值的必要屬性提供值時，您才能在 Amazon Cognito 使用者集區 API 請求中設定屬性的值。

自訂屬性對於讀取和寫入許可擁有不同的功能。您可針對使用者集區建立可變或不可變的屬性，也可以將其設定為任何應用程式用戶端的讀取或寫入屬性。

不可變的自訂屬性可在使用者建立期間更新一次。您可以使用以下方法填入不可變屬性。
+ `SignUp`：使用者在具有不可變自訂屬性的寫入存取權的應用程式用戶端註冊。使用者會為該屬性提供值。
+ 使用第三方 IdP 登入：使用者在具有不可變自訂屬性的寫入存取權的應用程式用戶端登入。您對於其 IdP 的使用者集區組態設有一項規則，會將提供的宣告映射至不可變屬性。這雖然可行，但並不實際，因為使用者只能登入一次。在第一次登入嘗試之後，Amazon Cognito 會拒絕嘗試，因為 會將規則映射至現在無法寫入的屬性。
+ `AdminCreateUser`：您為不可變屬性提供值。

### 具有範圍的屬性許可
<a name="user-pool-settings-attribute-scope-based-permissions"></a>

在您使用 AWS SDK 或 CDK、REST API 或 設定的使用者集區中 AWS CLI，您可以使用 OIDC 範圍 設定應用程式用戶端讀取或寫入存取權`oidc:profile`。`oidc:profile` 授予下列標準屬性的讀取或寫入存取權：
+ `name`
+ `family_name`
+ `given_name`
+ `middle_name`
+ `nickname`
+ `preferred_username`
+ `profile`
+ `picture`
+ `website`
+ `gender`
+ `birthdate`
+ `zoneinfo`
+ `locale`

此清單是 OIDC 標準屬性減去 `email`、`sub`、 `phone_number`和 `address`，如 [OIDC 規格第 2.4](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes) 節所定義。如需可指派至應用程式用戶端的範圍相關資訊，請參閱 [範圍、M2M 和資源伺服器](cognito-user-pools-define-resource-servers.md)。

若要將應用程式用戶端設定為寫入`oidc:profile`範圍內的屬性，請在 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 或 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) API 請求中，將 [WriteAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-WriteAttributes) 的值設定為 ，`oidc:profile`以及您想要允許應用程式修改的任何其他屬性。同樣地，若要授予這些屬性的讀取存取權，請將 `oidc:profile`新增至 [ReadAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-ReadAttributes) 的值。

您可以在使用者集區建立之後，變更屬性的許可和範圍。