

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

# 管理使用者存在錯誤回應
<a name="cognito-user-pool-managing-errors"></a>

Amazon Cognito 支援自訂使用者集區傳回的錯誤回應。自訂錯誤回應可用於使用者建立和身分驗證、密碼復原和確認操作。

使用使用者集區應用程式用戶端的 `PreventUserExistenceErrors` 設定，啟用或停用已有使用者相關錯誤。當您使用 Amazon Cognito 使用者集區 API 建立新的應用程式用戶端時， 預設為 `PreventUserExistenceErrors` `LEGACY`或 停用。在 Amazon Cognito 主控台中，預設`PreventUserExistenceErrors`會選取**防止使用者存在錯誤 **- `ENABLED` 的 設定。若要更新您的`PreventUserExistenceErrors`組態，請執行下列其中一項操作：
+ 在 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) API 請求`LEGACY`中變更介於 `ENABLED`和 `PreventUserExistenceErrors`之間的值。
+ 在 Amazon Cognito 主控台中編輯您的應用程式用戶端，並變更**防止使用者在所選 () 和取消選取 () 之間存在錯誤**的狀態`LEGACY`。`ENABLED`

當此屬性的值為 時`LEGACY`，當使用者嘗試使用不存在於使用者集區中的使用者名稱登入時，您的應用程式用戶端會傳回`UserNotFoundException`錯誤回應。

當此屬性的值為 時`ENABLED`，您的應用程式用戶端不會揭露使用者集區中使用者帳戶不存在的`UserNotFoundException`錯誤。當您提交不存在使用者名稱的請求時， 的`PreventUserExistenceErrors`組態`ENABLED`具有以下效果：
+ Amazon Cognito 會以非特定資訊回應 API 請求，否則其回應可能會揭露有效的使用者存在。
+ Amazon Cognito 會傳回一般身分驗證失敗回應給忘記密碼請求，以及傳回給具有身分驗證流程的身分驗證請求，但[選擇型身分驗證](authentication-flows-selection-sdk.md#authentication-flows-selection-choice) (`USER_AUTH`) *除外*，例如 `USER_SRP_AUTH`或 `CUSTOM_AUTH`。錯誤回應會告訴您使用者名稱或密碼不正確。
+ Amazon Cognito 會使用使用者集區允許的挑戰類型中的隨機選擇來回應以選擇為基礎的身分驗證請求。您的使用者集區可能會傳回通行金鑰、一次性密碼或密碼挑戰。
+ Amazon Cognito 帳戶確認和密碼復原 APIs的行為會交替傳回回應，指出程式碼已傳送至模擬交付媒體並傳回`InvalidParameterException`錯誤。

下列資訊詳細說明當 `PreventUserExistenceErrors`設定為 時，使用者集區操作的行為`ENABLED`。

## 身分驗證和使用者建立操作
<a name="cognito-user-pool-managing-errors-user-auth"></a>

您可以在使用者名稱密碼和安全遠端密碼 (SRP) 身分驗證中設定錯誤回應。您也可以自訂使用自訂身分驗證傳回的錯誤。以選擇為基礎的身分驗證不受您的`PreventUserExistenceErrors`組態影響。身分驗證流程中的使用者存在公開詳細資訊

**以選擇為基礎的身分驗證**  
在以`USER_AUTH`選擇為基礎的身分驗證流程中，Amazon Cognito 會根據您的使用者集區組態和使用者的屬性，從可用的主要身分驗證因素傳回挑戰。此身分驗證流程可以傳回密碼、安全遠端密碼 (SRP)、WebAuthn （密碼金鑰）、簡訊一次性密碼 (OTP) 或電子郵件 OTP 挑戰。使用`PreventUserExistenceErrors`作用中時，Amazon Cognito 會對不存在的使用者發出挑戰，以完成一或多個可用的身分驗證形式。使用`PreventUserExistenceErrors`非作用中時，Amazon Cognito 會傳回`UserNotFound`例外狀況。

**使用者名稱和密碼身分驗證**  
當 `PreventUserExistenceErrors`處於作用中狀態`Incorrect username or password`時`USER_PASSWORD_AUTH`，身分驗證流程 `ADMIN_USER_PASSWORD_AUTH`、 和 會`USER_AUTH`傳回`NotAuthorizedException`具有 訊息的 `PASSWORD`流程。當 `PreventUserExistenceErrors` 處於非作用中狀態時，這些流程會傳回 `UserNotFoundException`。

**安全遠端密碼 (SRP) 型身分驗證**  
最佳實務是，僅在沒有電子郵件地址、電話號碼`USER_SRP_AUTH`或偏好的使用者名稱[別名屬性](user-pool-settings-attributes.md#user-pool-settings-aliases)的使用者集區`USER_AUTH`中`PreventUserExistenceErrors`實作 或 `PASSWORD_SRP`流程。具有別名屬性的使用者可能不會受到 SRP 身分驗證流程中的使用者存在抑制。使用者名稱-密碼身分驗證流程 —`ADMIN_USER_PASSWORD_AUTH`、 `USER_PASSWORD_AUTH`和 `USER_AUTH``PASSWORD`挑戰 — 完全禁止來自別名屬性的使用者存在。  
當有人嘗試使用應用程式用戶端不知道的使用者名稱登入 SRP 時，Amazon Cognito 會在第一個步驟中傳回模擬回應，如 [RFC 5054 ](https://tools.ietf.org/html/rfc5054#section-2.5.1.3)中所述。Amazon Cognito 會針對相同的使用者名稱和使用者集區組合，傳回 [UUID](cognito-terms.md#terms-uuid) 格式的相同 salt 和內部使用者 ID。傳送附密碼證明的 `RespondToAuthChallenge` API 請求時，若使用者名稱或密碼不正確，Amazon Cognito 會傳回一般 `NotAuthorizedException` 錯誤。如需 SRP 身分驗證實作的詳細資訊，請參閱 [使用持久性密碼和安全承載登入](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp)。  
如果您使用以驗證為基礎的別名屬性，而且不可變的使用者名稱未格式化為 [UUID](cognito-terms.md#terms-uuid)，則可以使用使用者名稱和密碼身分驗證來模擬一般回應。

**自訂身分驗證挑戰 Lambda 觸發程序**  
當使用者嘗試使用身分驗證流程登入，但找不到其使用者名稱時，Amazon Cognito 會叫用自訂`CUSTOM_AUTH`身分驗證挑戰 Lambda 觸發。 [自訂身分驗證挑戰 Lambda 觸發程序](user-pool-lambda-challenge.md)輸入事件包含名為 的布林值參數`UserNotFound`，任何不存在的使用者的值`true`為 。此參數會出現在使用者集區傳送至建立、定義和驗證組成自訂身分驗證架構之驗證挑戰 Lambda 函數的請求事件中。當您在 Lambda 函數的邏輯中檢查此指標時，您可以模擬不存在之使用者的自訂身分驗證挑戰。

**身分驗證前 Lambda 觸發程序**  
當使用者嘗試登入但找不到使用者名稱時，Amazon Cognito 會叫用身分[驗證前觸發](user-pool-lambda-pre-authentication.md)條件。輸入事件包含`UserNotFound`參數，值`true`為 ，適用於任何不存在的使用者。

以下清單說明 `PreventUserExistenceErrors`對使用者帳戶建立的影響。使用者建立流程中的使用者存在公開詳細資訊

**SignUp**  
`SignUp` 操作一律會在已使用使用者名稱`UsernameExistsException`時傳回 。如果您不希望 Amazon Cognito 在應用程式中註冊使用者時，傳回電子郵件地址和電話號碼的 `UsernameExistsException` 錯誤訊息，請使用驗證型別名屬性。如需關於別名的詳細資訊，請參閱[自訂登入屬性](user-pool-settings-attributes.md#user-pool-settings-aliases)。  
如需 Amazon Cognito 如何防止使用 `SignUp` API 請求來探索使用者集區中使用者的範例，請參閱 [防止註冊時出現電子郵件地址和電話號碼 `UsernameExistsException` 錯誤](#cognito-user-pool-managing-errors-prevent-userexistence-errors)。

**匯入的使用者**  
如果啟用 `PreventUserExistenceErrors`，在驗證匯入的使用者期間，系統會傳回一般 `NotAuthorizedException` 錯誤，指出使用者名稱或密碼不正確，而不是傳回 `PasswordResetRequiredException`。如需詳細資訊，請參閱[需要匯入的使用者重設密碼](cognito-user-pools-using-import-tool.md#cognito-user-pools-using-import-tool-password-reset)。

**遷移使用者 Lambda 觸發器**  
Amazon Cognito 會在 Lambda 觸發器於原始活動內容中設定空白回應時，傳回不存在使用者的模擬回應。如需詳細資訊，請參閱[透過使用者遷移 Lambda 觸發程序匯入使用者](cognito-user-pools-import-using-lambda.md)。

### 防止註冊時出現電子郵件地址和電話號碼 `UsernameExistsException` 錯誤
<a name="cognito-user-pool-managing-errors-prevent-userexistence-errors"></a>

下列範例示範如何在使用者集區中設定別名屬性時，避免重複的電子郵件地址和電話號碼產生 `UsernameExistsException` 錯誤以回應 `SignUp` API 請求。您必須建立使用者集區，並將電子郵件地址或電話號碼作為別名屬性。如需詳細資訊，請參閱使用者集區屬性的*自訂登入屬性*一節。

1. Jie 註冊一個新的使用者名稱，也提供電子郵件地址 `jie@example.com`。Amazon Cognito 會將代碼傳送至其電子郵件地址。

   **範例 AWS CLI 命令**

   ```
   aws cognito-idp sign-up --client-id 1234567890abcdef0 --username jie --password PASSWORD --user-attributes Name="email",Value="jie@example.com"
   ```

   **回應範例**

   ```
   {
       "UserConfirmed": false, 
       "UserSub": "<subId>", 
       "CodeDeliveryDetails": {
           "AttributeName": "email", 
           "Destination": "j****@e****", 
           "DeliveryMedium": "EMAIL"
       }
   }
   ```

1. Jie 提供傳送給他們的代碼，以確認他們對電子郵件地址的所有權。這樣就完成了他們作為使用者的註冊。

   **範例 AWS CLI 命令**

   ```
   aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=jie --confirmation-code xxxxxx
   ```

1. Shirley 註冊一個新的使用者帳戶並提供電子郵件地址 `jie@example.com`。Amazon Cognito 不會傳回 `UsernameExistsException` 錯誤，並將確認代碼傳送到 Jie 的電子郵件地址。

   **範例 AWS CLI 命令**

   ```
   aws cognito-idp sign-up --client-id 1234567890abcdef0 --username shirley --password PASSWORD --user-attributes Name="email",Value="jie@example.com"
   ```

   **回應範例**

   ```
   {
       "UserConfirmed": false, 
       "UserSub": "<new subId>", 
       "CodeDeliveryDetails": {
           "AttributeName": "email", 
           "Destination": "j****@e****", 
           "DeliveryMedium": "EMAIL"
       }
   }
   ```

1. 在不同的情況下，Shirley 擁有 `jie@example.com`。Shirley 會擷取 Amazon Cognito 傳送至 Jie 電子郵件地址的代碼，並嘗試確認帳戶。

   **範例 AWS CLI 命令**

   ```
   aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=shirley --confirmation-code xxxxxx
   ```

   **回應範例**

   ```
   An error occurred (AliasExistsException) when calling the ConfirmSignUp operation: An account with the email already exists.
   ```

儘管 `jie@example.com` 已指派給現有使用者，Amazon Cognito 不會對 Shirley 的 `aws cognito-idp sign-up` 請求傳回錯誤。Shirley 必須先證明電子郵件地址的擁有權，Amazon Cognito 才會傳回錯誤回應。在具有別名屬性的使用者集區中，此行為會防止使用公有 `SignUp` API 來檢查指定的電子郵件地址或電話號碼是否有使用者。

此行為與 Amazon Cognito 以現有使用者名稱傳回 `SignUp` 請求的回應不同，如下列範例所示。雖然 Shirley 從此回應中得知已經有使用者名稱為 `jie` 的使用者，但他們不會得知任何與使用者相關聯的電子郵件地址或電話號碼。

**CLI 命令範例**

```
aws cognito-idp sign-up --client-id 1example23456789 --username jie --password PASSWORD
      --user-attributes Name="email",Value="shirley@example.com"
```

**回應範例**

```
An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists
```

## 密碼重設操作
<a name="cognito-user-pool-managing-errors-password-reset"></a>

當您防止使用者存在錯誤時，Amazon Cognito 會對使用者密碼重設作業傳回下列回應。

**ForgotPassword**  
當找不到使用者、使用者遭停用，或沒有經過驗證的傳遞機制可復原使用者的密碼時，Amazon Cognito 會為使用者傳回 `CodeDeliveryDetails` 以及模擬的傳遞媒介。模擬的傳遞媒體取決於使用者集區的輸入使用者名稱格式和驗證設定。

**ConfirmForgotPassword**  
Amazon Cognito 會為不存在或已停用的使用者傳回 `CodeMismatchException` 錯誤。如果使用 `ForgotPassword` 時未要求代碼，Amazon Cognito 會傳回 `ExpiredCodeException` 錯誤。

## 確認操作
<a name="cognito-user-pool-managing-errors-confirmation"></a>

當您防止使用者存在錯誤時，Amazon Cognito 會傳回以下對使用者確認和驗證作業的回應。

**ResendConfirmationCode**  
Amazon Cognito 會為已停用或不存在的使用者傳回 `CodeDeliveryDetails`。Amazon Cognito 會將確認碼傳送至現有使用者的電子郵件或電話號碼。

**ConfirmSignUp**  
 如果代碼已過期會傳回 `ExpiredCodeException`。使用者未獲授權時，Amazon Cognito 會傳回 `NotAuthorizedException`。如果代碼不符伺服器預期，Amazon Cognito 會傳回 `CodeMismatchException`。