

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

# 註冊及確認使用者帳戶
<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 身分。