本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
管理使用者存在錯誤回應
Amazon Cognito 支援自訂使用者集區傳回的錯誤回應。自訂錯誤回應可用於使用者建立和身分驗證、密碼復原和確認操作。
使用使用者集區應用程式用戶端的 PreventUserExistenceErrors 設定,啟用或停用已有使用者相關錯誤。當您使用 Amazon Cognito 使用者集區 API 建立新的應用程式用戶端時, 預設為 PreventUserExistenceErrors LEGACY或已停用。在 Amazon Cognito 主控台中,預設PreventUserExistenceErrors會選取防止使用者存在錯誤 - ENABLED 的 設定。若要更新您的PreventUserExistenceErrors組態,請執行下列其中一項操作:
- 
      在 UpdateUserPoolClient API 請求 LEGACY中變更介於ENABLED和PreventUserExistenceErrors之間的值。
- 
      在 Amazon Cognito 主控台中編輯您的應用程式用戶端,並變更防止使用者在所選 () 和取消選取 () 之間存在錯誤的狀態 LEGACY。ENABLED
當此屬性的值為 時LEGACY,當使用者嘗試使用不存在於使用者集區中的使用者名稱登入時,您的應用程式用戶端會傳回UserNotFoundException錯誤回應。
當此屬性的值為 時ENABLED,您的應用程式用戶端不會揭露使用者集區中使用者帳戶不存在的UserNotFoundException錯誤。當您提交不存在使用者名稱的請求時, 的PreventUserExistenceErrors組態ENABLED具有以下效果:
- 
      Amazon Cognito 會以非特定資訊回應 API 請求,否則其回應可能會揭露有效的使用者存在。 
- 
      Amazon Cognito 會傳回一般身分驗證失敗回應給忘記密碼請求,以及傳回給具有身分驗證流程的身分驗證請求,但選擇型身分驗證 ( USER_AUTH) 除外,例如USER_SRP_AUTH或CUSTOM_AUTH。錯誤回應會告訴您使用者名稱或密碼不正確。
- 
      Amazon Cognito 會使用使用者集區允許的挑戰類型中的隨機選擇來回應以選擇為基礎的身分驗證請求。您的使用者集區可能會傳回通行金鑰、一次性密碼或密碼挑戰。 
- 
      Amazon Cognito 帳戶確認和密碼復原 APIs的行為會交替傳回回應,指出程式碼已傳送至模擬交付媒體並傳回 InvalidParameterException錯誤。
下列資訊詳細說明當 PreventUserExistenceErrors設定為 時,使用者集區操作的行為ENABLED。
身分驗證和使用者建立操作
您可以在使用者名稱密碼和安全遠端密碼 (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_AUTH中PreventUserExistenceErrors實作 或PASSWORD_SRP流程。具有別名屬性的使用者可能不會受到 SRP 身分驗證流程中的使用者存在抑制。使用者名稱-密碼身分驗證流程 —ADMIN_USER_PASSWORD_AUTH、USER_PASSWORD_AUTH和USER_AUTHPASSWORD挑戰 — 完全禁止來自別名屬性的使用者存在。當有人嘗試使用應用程式用戶端不知道的使用者名稱登入 SRP 時,Amazon Cognito 會在第一個步驟中傳回模擬回應,如 RFC 5054 中所述。Amazon Cognito 會針對相同的使用者名稱和使用者集區組合,傳回 UUID 格式的相同 salt 和內部使用者 ID。傳送附密碼證明的 RespondToAuthChallengeAPI 請求時,若使用者名稱或密碼不正確,Amazon Cognito 會傳回一般NotAuthorizedException錯誤。如需 SRP 身分驗證實作的詳細資訊,請參閱 使用持久性密碼和安全承載登入。注意如果您使用以驗證為基礎的別名屬性,而且不可變的使用者名稱未格式化為 UUID,則可以使用使用者名稱和密碼身分驗證來模擬一般回應。 
- 自訂身分驗證挑戰 Lambda 觸發程序
- 
          當使用者嘗試使用身分驗證流程登入,但找不到其使用者名稱時,Amazon Cognito 會叫用自訂 CUSTOM_AUTH身分驗證挑戰 Lambda 觸發條件。 自訂身分驗證挑戰 Lambda 觸發器輸入事件包含名為 的布林值參數UserNotFound,任何不存在的使用者的值true為 。此參數會出現在您的使用者集區傳送至建立、定義和驗證組成自訂身分驗證架構之驗證挑戰 Lambda 函數的請求事件中。當您在 Lambda 函數的邏輯中檢查此指標時,您可以為不存在的使用者模擬自訂身分驗證挑戰。
- 身分驗證前 Lambda 觸發程序
- 
          當使用者嘗試登入但找不到使用者名稱時,Amazon Cognito 會叫用身分驗證前觸發條件。輸入事件包含 UserNotFound參數,值true為 ,適用於任何不存在的使用者。
下列清單說明 PreventUserExistenceErrors對使用者帳戶建立的影響。
使用者建立流程中的使用者存在公開詳細資訊
- SignUp
- 
          SignUp操作一律會在已使用使用者名稱UsernameExistsException時傳回 。如果您不希望 Amazon Cognito 在應用程式中註冊使用者時,傳回電子郵件地址和電話號碼的UsernameExistsException錯誤訊息,請使用驗證型別名屬性。如需關於別名的詳細資訊,請參閱自訂登入屬性。如需 Amazon Cognito 如何防止使用 SignUpAPI 請求來探索使用者集區中使用者的範例,請參閱 防止註冊時出現電子郵件地址和電話號碼 UsernameExistsException 錯誤。
- 匯入的使用者
- 
          如果啟用 PreventUserExistenceErrors,在驗證匯入的使用者期間,系統會傳回一般NotAuthorizedException錯誤,指出使用者名稱或密碼不正確,而不是傳回PasswordResetRequiredException。如需詳細資訊,請參閱需要匯入的使用者重設密碼。
- 遷移使用者 Lambda 觸發器
- 
          Amazon Cognito 會在 Lambda 觸發器於原始活動內容中設定空白回應時,傳回不存在使用者的模擬回應。如需詳細資訊,請參閱透過使用者遷移 Lambda 觸發程序匯入使用者。 
防止註冊時出現電子郵件地址和電話號碼 UsernameExistsException 錯誤
      下列範例示範如何在使用者集區中設定別名屬性時,避免重複的電子郵件地址和電話號碼產生 UsernameExistsException 錯誤以回應 SignUp API 請求。您必須建立使用者集區,並將電子郵件地址或電話號碼作為別名屬性。如需詳細資訊,請參閱使用者集區屬性的自訂登入屬性一節。
- 
          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" } }
- 
          Jie 提供傳送給他們的代碼,以確認他們對電子郵件地址的所有權。這樣就完成了他們作為使用者的註冊。 範例 AWS CLI 命令 aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=jie --confirmation-code xxxxxx
- 
          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" } }
- 
          在不同的情況下,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
密碼重設操作
當您防止使用者存在錯誤時,Amazon Cognito 會對使用者密碼重設作業傳回下列回應。
- ForgotPassword
- 
          當找不到使用者、使用者遭停用,或沒有經過驗證的傳遞機制可復原使用者的密碼時,Amazon Cognito 會為使用者傳回 CodeDeliveryDetails以及模擬的傳遞媒介。模擬的傳遞媒體取決於使用者集區的輸入使用者名稱格式和驗證設定。
- ConfirmForgotPassword
- 
          Amazon Cognito 會為不存在或已停用的使用者傳回 CodeMismatchException錯誤。如果使用ForgotPassword時未要求代碼,Amazon Cognito 會傳回ExpiredCodeException錯誤。
確認操作
當您防止使用者存在錯誤時,Amazon Cognito 會傳回以下對使用者確認和驗證作業的回應。
- ResendConfirmationCode
- 
          Amazon Cognito 會為已停用或不存在的使用者傳回 CodeDeliveryDetails。Amazon Cognito 會將確認碼傳送至現有使用者的電子郵件或電話號碼。
- ConfirmSignUp
- 
          如果代碼已過期會傳回 ExpiredCodeException。使用者未獲授權時,Amazon Cognito 會傳回NotAuthorizedException。如果代碼不符伺服器預期,Amazon Cognito 會傳回CodeMismatchException。