本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用者集區身分驗證流程
Amazon Cognito 包含幾種對您的使用者進行身分驗證的方法。無論您是否擁有網域,所有使用者集區都可以驗證使用者集區中的使用者API。如果您將網域新增至使用者集區,則可以使用使用者集區端點。使用者集區API支援各種授權模型和要求的要API求流程。
為驗證使用者的身分,Amazon Cognito 支援身分驗證流程納入密碼以外的新挑戰類型。Amazon Cognito 身份驗證通常要求您按照以下順序實施兩項API操作:
使用者身分驗證會透過回答連續挑戰,直到驗證失敗或者 Amazon Cognito 發出權杖給使用者。您可以使用 Amazon Cognito 在包含不同挑戰的程序中重複這些步驟,以支援任何自訂的身分驗證流程。
![Authentication flow diagram showing user, mobile/web app, and user pool interactions for token issuance.](images/cognito-user-pool-auth-flow-srp.png)
通常,您的應用程式會產生從使用者收集資訊的提示,並將該資訊以API請求提交給 Amazon Cognito。考慮使用者集區中的一個InitiateAuth
流程,其中您已將使用者設定為多重要素驗證 (MFA)。
-
您的應用程式會提示您的使用者輸入其使用者名稱和密碼。
-
您可將使用者名稱和密碼作為參數包含於
InitiateAuth
中。 -
Amazon Cognito 會傳回一個
SMS_MFA
挑戰和工作階段識別符。 -
您的應用程式會提示使用者從手機輸入MFA驗證碼。
-
您將該代碼和工作階段識別符包含於
RespondToAuthChallenge
請求中。
根據您使用者集區的功能,您最終可能會在應用程式從 Amazon Cognito 擷取字符之前回應對 InitiateAuth
的多個挑戰。Amazon Cognito 會在每個請求的回應中包含一個工作階段字串。要將您的API請求合併到身份驗證流程中,請在每個後續請求中包含上一個請求的響應中的會話字符串。依預設,您的使用者在工作階段字串到期前,有三分鐘的時間完成每項挑戰。如要調整此期間,請變更您的應用程式用戶端身分驗證流程工作階段持續時間。下列程序說明如何在應用程式用戶端設定中變更此設定。
注意
身份驗證流程工作階段持續時間設定適用於 Amazon Cognito 使用者集區API的身份驗證 Amazon Cognito 託管的使用者介面將多因素身份驗證的工作階段持續時間設定為 3 分鐘,密碼重設代碼則設定為 8 分鐘。
如需應用程式用戶端的詳細資訊,請參閱 使用者集區應用程式用戶端。
您可以使用 AWS Lambda 觸發器來自訂使用者驗證的方式。這些觸發會發出並驗證自身的挑戰做為驗證流程的一部分。
您也可以針對安全的後端伺服器使用系統管理員驗證流程。您可以利用使用者遷移身分驗證流程讓使用者遷移成為可能,而無需使用者重設密碼。
針對失敗登入嘗試的 Amazon Cognito 鎖定行為
使用密碼進行五次未驗證或IAM經過驗證的登入嘗試失敗後,Amazon Cognito 會鎖定您的使用者一秒鐘。然後,鎖定持續時間會在每增加一次失敗嘗試後加倍,最多可達約 15 分鐘。在鎖定期間進行的嘗試會產生 Password attempts exceeded
例外狀況,並且不會影響後續鎖定期間的持續時間。對於嘗試登入失敗的累計次數 n (不包括 Password attempts
exceeded
例外狀況),Amazon Cognito 會將您的使用者鎖定 2^(n-5) 秒。若要將鎖定重設為 n=0 初始狀態,您的使用者必須在鎖定期間過後成功登入,或是在鎖定後連續 15 分鐘內不得進行任何登入嘗試。此行為可能會有所變更。此行為不適用於自訂挑戰,除非該挑戰也執行以密碼為基礎的身份驗證。
用戶端身分驗證流程
下列程序適用於您使用AWS Amplify
-
使用者在應用程式中輸入使用者名稱和密碼。
-
該應用程序使用用戶的用戶名和安全遠程密碼(SRP)詳細信息調用
InitiateAuth
操作。此API作業會傳回驗證參數。
注意
該應用程序使用內置的 Amazon Cognito SRP 功能生成SRP詳細信息。 AWS SDKs
-
應用程式會呼叫
RespondToAuthChallenge
操作。如果呼叫成功,Amazon Cognito 會傳回使用者的權杖,身分驗證流程便已完成。如果 Amazon Cognito 需要另一個挑戰,對
RespondToAuthChallenge
的呼叫就不會傳回任何權杖。相反地,呼叫會傳回工作階段。 -
如果
RespondToAuthChallenge
返回會話,應用程序RespondToAuthChallenge
再次調用,這次與會話和挑戰響應(例如,MFA代碼)。
伺服器端身分驗證流程
如果您沒有使用者應用程式,而是使用 Java、Ruby 或 Node.js 安全後端或伺服器端應用程式,則可以API針對 Amazon Cognito 使用者集區使用經過驗證的伺服器端。
如果是伺服器端應用程式,使用者集區身分驗證類似於用戶端應用程式的身分驗證,但以下除外:
-
伺服器端應用程式會呼叫
AdminInitiateAuth
API作業 (而非InitiateAuth
)。此作業需要具有包含cognito-idp:AdminInitiateAuth
和權限的 AWS 認證cognito-idp:AdminRespondToAuthChallenge
。此操作會傳回必要的身分驗證參數。 -
在伺服器端應用程式具有驗證參數之後,它會呼叫
AdminRespondToAuthChallenge
API作業 (而非RespondToAuthChallenge
)。只有當您提供 AWS 認證時,AdminRespondToAuthChallenge
API作業才會成功。
如需有關使用登 AWS 入資料簽署 Amazon Cognito API 請求的詳細資訊,請參閱AWS 一般參考中的簽名版本 4 簽署程序。
AdminInitiateAuth
和AdminRespondToAuthChallenge
API操作無法接受 username-and-password 用戶憑據進行管理員登錄,除非您通過以下方式之一明確允許他們這樣做:
-
當您呼叫
CreateUserPoolClient
或UpdateUserPoolClient
時,在ExplicitAuthFlow
參數中包含ALLOW_ADMIN_USER_PASSWORD_AUTH
(先前稱為ADMIN_NO_SRP_AUTH
)。 -
將
ALLOW_ADMIN_USER_PASSWORD_AUTH
新增至您的應用程式用戶端 身份驗證流程 清單。在 App clients and analytics (應用程式用戶端與分析) 下,您使用者集區中的 App integration (應用程式整合) 索引標籤上設定應用程式用戶端。如需詳細資訊,請參閱 使用者集區應用程式用戶端。
自訂身分驗證流程
Amazon Cognito 使用者集區也讓您能夠使用自訂身份驗證流程,協助您使用觸發器建立挑戰/回應型身份驗證模型。 AWS Lambda
注意
您無法將進階安全性功能用於遭到入侵的憑證,以及具有自訂驗證流程的調適性驗證。如需詳細資訊,請參閱 將進階安全性新增到使用者集區。
自訂身分驗證流程可建立自訂挑戰和回應週期,以滿足不同需求。流程會從指示要使用的驗證類型的InitiateAuth
API作業呼叫開始,並提供任何初始驗證參數。Amazon Cognito 會以下列其中一種資訊類型回應 InitiateAuth
呼叫:
-
對使用者的挑戰,伴隨工作階段和參數。
-
錯誤 (如果使用者驗證失敗)。
-
ID、存取和重新整理權杖 (如果
InitiateAuth
呼叫中提供的參數足以讓使用者登入)。(通常,使用者或應用程式必須先回答挑戰,但您的自訂程式碼必須確定這一點)。
如果 Amazon Cognito 以挑戰回應 InitiateAuth
呼叫,應用程式將會收集更多輸入,並呼叫 RespondToAuthChallenge
操作。此呼叫提供挑戰回應,並將其傳回工作階段。Amazon Cognito 回應 RespondToAuthChallenge
呼叫的方式類似於回應 InitiateAuth
呼叫。如果使用者已登入,Amazon Cognito 會提供權杖,或者如果使用者未登入,Amazon Cognito 會提供另一個挑戰,或者錯誤。如果 Amazon Cognito 傳回另一項挑戰,順序將會重複,而應用程式將會呼叫 RespondToAuthChallenge
,直到使用者成功登入或傳回錯誤。如需InitiateAuth
和RespondToAuthChallenge
API作業的詳細資訊,請參閱API文件。
內建身分驗證流程與挑戰
Amazon Cognito 包含內建ChallengeName
值AuthFlow
和值,因此標準身份驗證流程可以透過安全遠端密碼 (SRP) 通訊協定驗證使用者名稱和密碼。對這些流程的 AWS SDKs內置支持與 Amazon Cognito。
流程一開始會傳送 USER_SRP_AUTH
作為 AuthFlow
至 InitiateAuth
。您也可以傳送 AuthParameters
中的 USERNAME
和 SRP_A
值。如果 InitiateAuth
呼叫成功,則回應會包含 PASSWORD_VERIFIER
並將其作為在挑戰參數中的 ChallengeName
和 SRP_B
。然後,應用程式會呼叫 RespondToAuthChallenge
搭配 PASSWORD_VERIFIER
ChallengeName
和 ChallengeResponses
中的必要參數。如果對 RespondToAuthChallenge
的呼叫成功且使用者登入,Amazon Cognito 就會發出權杖。如果您為使用者啟用了多重要素身份驗證 (MFA),Amazon Cognito 會傳回的ChallengeName
。SMS_MFA
此應用程式可透過另一個對 RespondToAuthChallenge
的呼叫來提供必要的程式碼。
自訂身分驗證流程與挑戰
應用程式可以呼叫 InitiateAuth
,並將CUSTOM_AUTH
做為 Authflow
,以啟動自訂身分驗證流程。使用自訂身分驗證流程時,三個 Lambda 觸發程序會控制挑戰和回應的驗證。
-
DefineAuthChallenge
Lambda 觸發程序使用以前的挑戰和回應的工作階段陣列作為輸入。然後,它產生下一個挑戰名稱和布林值,指出使用者是否通過身分驗證 (並可被授予權杖)。這個 Lambda 觸發器是一種狀態機器,可控制使用者通過挑戰的路徑。 -
CreateAuthChallenge
Lambda 觸發程序會以挑戰名稱作為輸入,並產生挑戰和參數來評估回應。當DefineAuthChallenge
傳回CUSTOM_CHALLENGE
作為下一個挑戰,身分驗證流程將會呼叫CreateAuthChallenge
。CreateAuthChallenge
Lambda 觸發程序會在挑戰中繼資料參數中傳遞下一個挑戰類型。 -
VerifyAuthChallengeResponse
Lambda 函數會評估回應,並傳回布林值,指出回應是否有效。
自定義身份驗證流程還可以使用內置挑戰的組合,例如SRP密碼驗證和MFA通過SMS。它可以使用自定義挑戰,例如CAPTCHA或秘密問題。
在自訂驗證流程中使用SRP密碼驗證
如果要包含SRP在自訂驗證流程中,則必須從開始SRP。
-
若要在自訂流程中啟動SRP密碼驗證,應
InitiateAuth
用程式會CUSTOM_AUTH
以Authflow
. 在AuthParameters
地圖中,來自您的應用程序的請求包括SRP_A:
(SRPA 值)和CHALLENGE_NAME: SRP_A
。 -
CUSTOM_AUTH
流程會以challengeName: SRP_A
和challengeResult: true
的初始工作階段叫用DefineAuthChallenge
Lambda 觸發程序。您的 Lambda 函數以challengeName: PASSWORD_VERIFIER
、issueTokens: false
和failAuthentication: false
回應。 -
接下來的應用程序必須調
RespondToAuthChallenge
用以challengeName: PASSWORD_VERIFIER
及challengeResponses
地圖SRP中所需的其他參數。 -
如果 Amazon Cognito 驗證密碼,
RespondToAuthChallenge
會以challengeName: PASSWORD_VERIFIER
和challengeResult: true
的第二個工作階段叫用DefineAuthChallenge
Lambda 觸發程序。到時DefineAuthChallenge
Lambda 觸發程序可以回應challengeName: CUSTOM_CHALLENGE
以開始自訂挑戰。 -
如果已MFA為使用者啟用,Amazon Cognito 驗證密碼後,系統就會要求您的使用者設定或登入。MFA
注意
Amazon Cognito 託管的登入網頁無法啟用 自訂身分驗證挑戰 Lambda 觸發程序。
如需 Lambda 觸發器的詳細資訊,包括範本程式碼,請參閱 使用 Lambda 觸發程序來自訂使用者集區工作流程。
管理員身分驗證流程
驗證的最佳作法是使用中所述的API作業自訂身分驗證流程進SRP行密碼驗證。 AWS SDKs使用這種方法,這種方法可以幫助他們使用SRP。但是,如果您想避免SRP計算,安全的後端伺服器可以使用另一組管理員API作業。對於這些後端管理員實作,會使用 AdminInitiateAuth
來代替 InitiateAuth
,並使用 AdminRespondToAuthChallenge
來代替 RespondToAuthChallenge
。因為您可以以純文字形式提交密碼,因此在使用這些作業時不需要SRP進行計算。請見此處範例:
AdminInitiateAuth Request { "AuthFlow":"ADMIN_USER_PASSWORD_AUTH", "AuthParameters":{ "USERNAME":"
<username>
", "PASSWORD":"<password>
" }, "ClientId":"<clientId>
", "UserPoolId":"<userPoolId>
" }
這些管理員身分驗證操作需要開發人員登入資料,並使用 AWS
Signature Version 4 (SigV4) 簽署程序。這些操作在標準版中可用 AWS
SDKs,包括 Node.js,這對於 Lambda 函數來說很方便。若要使用這些操作並讓它們接受純文字密碼,您必須在主控台為應用程式啟用它們。或者,您可以在呼叫 CreateUserPoolClient
或 UpdateUserPoolClient
時對 ExplicitAuthFlow
參數傳遞 ADMIN_USER_PASSWORD_AUTH
。InitiateAuth
和 RespondToAuthChallenge
操作不接受 ADMIN_USER_PASSWORD_AUTH
AuthFlow
。
在 AdminInitiateAuth
回應 ChallengeParameters
中,USER_ID_FOR_SRP
屬性 (如果存在) 將會包含使用者的實際使用者名稱,而不是別名 (例如電子郵件地址或電話號碼)。在呼叫 AdminRespondToAuthChallenge
期間,在 ChallengeResponses
中,您必須在 USERNAME
參數中傳遞此使用者名稱。
注意
由於後端管理實作使用管理員身分驗證流程,所以此流程不支援裝置追蹤。當您開啟裝置追蹤功能時,管理員身分驗證會成功,但是用來重新整理存取權杖的任何呼叫都會失敗。
使用者遷移身分驗證流程
使用者遷移 Lambda 觸發程序有助於將使用者從舊式使用者管理系統遷移到使用者集區。如果您選擇 USER_PASSWORD_AUTH
身分驗證流程,使用者就不必使用者遷移期間重設密碼。此流程會在驗證期間透過加密SSL連線將您的使用者密碼傳送至服務。
移轉所有使用者後,請將流程切換至更安全的SRP流程。SRP流程不會透過網路傳送任何密碼。
若要進一步了解 Lambda 觸發程序,請參閱使用 Lambda 觸發程序來自訂使用者集區工作流程。
如需使用 Lambda 觸發程序來遷移使用者的詳細資訊,請參閱透過使用者遷移 Lambda 觸發程序將使用者匯入到使用者集區。