本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用者集區身分驗證流程
Amazon Cognito 包含幾種對您的使用者進行身分驗證的方法。無論您是否有網域,所有使用者集區都可以在使用者集區 中驗證使用者API。如果您將網域新增至使用者集區,則可以使用使用者集區端點。使用者集區API支援各種授權模型和API請求流程。
為驗證使用者的身分,Amazon Cognito 支援身分驗證流程納入密碼以外的新挑戰類型。Amazon Cognito 身分驗證通常會要求您依下列順序實作兩個API操作:
使用者身分驗證會透過回答連續挑戰,直到驗證失敗或者 Amazon Cognito 發出權杖給使用者。您可以使用 Amazon Cognito 在包含不同挑戰的程序中重複這些步驟,以支援任何自訂的身分驗證流程。
一般而言,您的應用程式會產生提示,以從您的使用者收集資訊,並將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 此操作會傳回身分驗證參數。
注意
應用程式會使用內建於 AWS 的 Amazon Cognito SRP功能產生SRP詳細資訊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 包含內建 AuthFlow
和 ChallengeName
值,讓標準身分驗證流程可以透過安全遠端密碼 (SRP) 通訊協定驗證使用者名稱和密碼。內建支援使用 AWS SDKsAmazon 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 觸發程序匯入使用者。