

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

# 註冊及確認使用者帳戶
<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\_HASH 的原生參數 | 
| --- |--- |
| 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\+user1@simulator.amazonses.com* 或 *success\+user2@simulator.amazonses.com*。Amazon Cognito 將能順利傳送電子郵件至這類地址，但您無法查看其傳送的電子郵件。當您希望透過新增多名測試使用者至使用者集區的方式測試註冊程序，而且每一名測試使用者皆有其獨一的電子郵件地址時，即適用此選項。