本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
管理使用者存在錯誤回應
Amazon Cognito 支援自訂使用者集區傳回的錯誤回應。自訂錯誤回應可用於使用者建立和身分驗證、密碼復原和確認操作。
使用使用者集區應用程式用戶端的 PreventUserExistenceErrors
設定,啟用或停用已有使用者相關錯誤。當您使用 Amazon Cognito 使用者集區 API 建立新的應用程式用戶端時LEGACY
,預設為或停用。PreventUserExistenceErrors
在 Amazon Cognito 主控台中,預設會選取「防止使用者存在錯誤」選項 PreventUserExistenceErrors
— 設定ENABLED
為 —。若要更新您的PreventUserExistenceErrors
組態,請執行下列其中一個動作:
-
變更 UpdateUserPoolClientAPI 要求
PreventUserExistenceErrors
之間ENABLED
和LEGACY
之間的值。 -
在 Amazon Cognito 主控台中編輯您的應用程式用戶端,並變更選取 () 和取消選取 (
ENABLED
) 之間防止使用者存在錯誤的狀態。LEGACY
當此屬性的值為時LEGACY
,當用戶嘗試使用用戶池中不存在的用戶名登錄時,您的應用程序客戶端將返回UserNotFoundException
錯誤響應。
當此屬性的值為時ENABLED
,您的應用程序客戶端不會洩露用戶池中用戶帳戶的不存在,並顯示UserNotFoundException
錯誤。的PreventUserExistenceErrors
組態ENABLED
具有下列影響:
-
Amazon Cognito 會回應 API 請求的非特定資訊,否則其回應可能會揭露有效使用者存在。
-
Amazon Cognito 登入和忘記密碼 API 會傳回一般身份驗證失敗回應。錯誤回應會告訴您使用者名稱或密碼不正確。
-
Amazon Cognito 帳戶確認和密碼復原 API 會傳回回應,指出代碼已傳送至模擬交付媒體,而不是部分表示使用者聯絡資訊。
下列資訊詳細說明使用者集區作業設定PreventUserExistenceErrors
為時的行為ENABLED
。
身份驗證和用戶創建操作
您可以在使用者名稱密碼和安全遠端密碼 (SR P) 驗證中設定錯誤回應。您也可以使用自訂身分驗證自訂傳回的錯誤。下列 API 會執行這些驗證作業:
-
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 返回SRP_B
和鹽為用戶。找不到使用者時,Amazon Cognito 會傳回第一個步驟中的模擬回應,如 RFC 5054所述。Amazon Cognito 會傳回相同的 ‘salt’,並以全域唯一識別符 (UUID) 格式傳回相同使用者名稱和使用者集區組合的內部使用者 ID。傳送附密碼證明的 RespondToAuthChallenge
API 請求時,若使用者名稱或密碼不正確,Amazon Cognito 會傳回一般NotAuthorizedException
錯誤。注意
如果您使用驗證型別名屬性,且不可變使用者名稱格式不是 UUID,可以用使用者名稱和密碼身分驗證模擬一般回應。
- 自訂身分驗證挑戰 Lambda 觸發器
-
如果您使用自訂身分驗證挑戰 Lambda 觸發器並啟用錯誤回應,
LambdaChallenge
就會傳回UserNotFound
布林參數。接著會以DefineAuthChallenge
、VerifyAuthChallenge
及CreateAuthChallenge
Lambda 觸發器請求傳遞。您可以使用此觸發器來模擬不存在使用者的自訂授權挑戰。如果您為不存在的使用者呼叫預先進行身分驗證的 Lambda 觸發器,Amazon Cognito 就會傳回UserNotFound
。
下列清單示範如何自訂使用者建立操作中的錯誤回應。
- SignUp
-
UsernameExistsException
當一個用戶名已經採取SignUp
操作總是返回。如果您不希望 Amazon Cognito 在應用程式中註冊使用者時,傳回電子郵件地址和電話號碼的UsernameExistsException
錯誤訊息,請使用驗證型別名屬性。如需關於別名的詳細資訊,請參閱自訂登入屬性。如需 Amazon Cognito 如何防止使用
SignUp
API 請求來探索使用者集區中使用者的範例,請參閱 防止註冊時出現電子郵件地址和電話號碼 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
。