本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
管理使用者存在錯誤回應
Amazon Cognito 支援自訂使用者集區傳回的錯誤回應。自訂錯誤回應可用於使用者建立和身分驗證、密碼復原和確認操作。
使用使用者集區應用程式用戶端的 PreventUserExistenceErrors
設定,啟用或停用已有使用者相關錯誤。當您使用 Amazon Cognito 使用者集區 建立新的應用程式用戶端時,預設為 API PreventUserExistenceErrors
LEGACY
或 停用。在 Amazon Cognito 主控台中,預設會選取防止使用者存在錯誤 - ENABLED
為 的設定 PreventUserExistenceErrors
-。若要更新您的PreventUserExistenceErrors
組態,請執行下列其中一項操作:
-
在
LEGACY
中變更介於ENABLED
和PreventUserExistenceErrors
之間的值 UpdateUserPoolClient API 請求。 -
在 Amazon Cognito 主控台中編輯您的應用程式用戶端,並變更防止使用者在所選 () 和取消選取 () 之間存在錯誤的狀態
LEGACY
。ENABLED
當此屬性的值為 時LEGACY
,當使用者嘗試使用不存在於使用者集區中的使用者名稱登入時,您的應用程式用戶端會傳回UserNotFoundException
錯誤回應。
當此屬性的值為 時ENABLED
,您的應用程式用戶端不會在UserNotFoundException
發生錯誤的情況下,揭露使用者集區中使用者帳戶不存在。的PreventUserExistenceErrors
組態ENABLED
具有下列效果:
-
Amazon Cognito 會以非特定資訊回應其回應可能揭露有效使用者存在的API請求。
-
Amazon Cognito 登入和忘記密碼會APIs傳回一般身分驗證失敗回應。錯誤回應會告訴您使用者名稱或密碼不正確。
-
Amazon Cognito 帳戶確認和密碼復原會APIs傳回回應,指出程式碼已傳送至模擬交付媒體,而不是部分表示使用者的聯絡資訊。
下列資訊詳細說明 PreventUserExistenceErrors
設定為 時使用者集區操作的行為ENABLED
。
驗證和使用者建立操作
您可以在使用者名稱-密碼和安全遠端密碼 (SRP) 身分驗證中設定錯誤回應。您也可以自訂使用自訂身分驗證傳回的錯誤。下列 APIs會執行這些身分驗證操作:
-
AdminInitiateAuth
-
AdminRespondToAuthChallenge
-
InitiateAuth
-
RespondToAuthChallenge
下列清單示範如何自訂使用者身分驗證操作中的錯誤回應。
- 使用者名稱和密碼身分驗證
-
若要使用
ADMIN_USER_PASSWORD_AUTH
和 登入使用者USER_PASSWORD_AUTH
,請在AdminInitiateAuth
或InitiateAuth
API請求中包含使用者名稱和密碼。使用者名稱或密碼不正確時,Amazon Cognito 傳回一般NotAuthorizedException
錯誤。 - 安全遠端密碼 (SRP) 型身分驗證
-
若要使用 登入使用者
USER_SRP_AUTH
,請在AdminInitiateAuth
或InitiateAuth
API請求中包含使用者名稱和SRP_A
參數。為了回應,Amazon Cognito 會傳回使用者的 saltSRP_B
和 salt。當找不到使用者時,Amazon Cognito 會在第一個步驟中傳回模擬回應,如 RFC5054所述。Amazon Cognito 會針對相同的使用者名稱和使用者集區組合,傳回UUID格式相同的 salt 和內部使用者 ID。當您傳送具有密碼證明的 RespondToAuthChallenge
API請求時,Amazon Cognito 會在使用者名稱或密碼不正確時傳回一般NotAuthorizedException
錯誤。注意
如果您使用的是驗證型別名屬性,而且不可變的使用者名稱未格式化為 ,則可以使用使用者名稱和密碼身分驗證來模擬一般回應UUID。
- 自訂身分驗證挑戰 Lambda 觸發器
-
如果您使用自訂身分驗證挑戰 Lambda 觸發器並啟用錯誤回應,
LambdaChallenge
就會傳回UserNotFound
布林參數。接著會以DefineAuthChallenge
、VerifyAuthChallenge
及CreateAuthChallenge
Lambda 觸發器請求傳遞。您可以使用此觸發器來模擬不存在使用者的自訂授權挑戰。如果您為不存在的使用者呼叫預先進行身分驗證的 Lambda 觸發器,Amazon Cognito 就會傳回UserNotFound
。
下列清單示範如何自訂使用者建立操作中的錯誤回應。
- SignUp
-
SignUp
操作一律會在已使用使用者名稱UsernameExistsException
時傳回 。如果您不希望 Amazon Cognito 在應用程式中註冊使用者時,傳回電子郵件地址和電話號碼的UsernameExistsException
錯誤訊息,請使用驗證型別名屬性。如需關於別名的詳細資訊,請參閱自訂登入屬性。如需 Amazon Cognito 如何防止使用
SignUp
API請求來探索使用者集區中的使用者的範例,請參閱 防止註冊時出現電子郵件地址和電話號碼 UsernameExistsException 錯誤。 - 匯入的使用者
-
如果啟用
PreventUserExistenceErrors
,在驗證匯入的使用者期間,系統會傳回一般NotAuthorizedException
錯誤,指出使用者名稱或密碼不正確,而不是傳回PasswordResetRequiredException
。如需詳細資訊,請參閱需要匯入的使用者重設密碼。 - 遷移使用者 Lambda 觸發器
-
Amazon Cognito 會在 Lambda 觸發器於原始活動內容中設定空白回應時,傳回不存在使用者的模擬回應。如需詳細資訊,請參閱遷移使用者 Lambda 觸發器。
防止註冊時出現電子郵件地址和電話號碼 UsernameExistsException
錯誤
下列範例示範當您在使用者集區中設定別名屬性時,如何防止重複的電子郵件地址和電話號碼在回應SignUp
API請求時產生UsernameExistsException
錯誤。您必須建立使用者集區,並將電子郵件地址或電話號碼作為別名屬性。如需詳細資訊,請參閱使用者集區屬性的自訂登入屬性一節。
-
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
。