使用者集區身分驗證流程 - Amazon Cognito

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用者集區身分驗證流程

Amazon Cognito 包含幾種對您的使用者進行身分驗證的方法。無論您是否有網域,所有使用者集區都可以在使用者集區 中驗證使用者API。如果您將網域新增至使用者集區,則可以使用使用者集區端點。使用者集區API支援各種授權模型和API請求流程。

為驗證使用者的身分,Amazon Cognito 支援身分驗證流程納入密碼以外的新挑戰類型。Amazon Cognito 身分驗證通常會要求您依下列順序實作兩個API操作:

Public authentication

InitiateAuthRespondToAuthChallenge 未經驗證APIs,可與用戶端公有應用程式用戶端搭配使用。

Server-side authentication

AdminInitiateAuthAdminRespondToAuthChallenge需要IAM憑證,且 適用於伺服器端機密應用程式用戶端。

使用者身分驗證會透過回答連續挑戰,直到驗證失敗或者 Amazon Cognito 發出權杖給使用者。您可以使用 Amazon Cognito 在包含不同挑戰的程序中重複這些步驟,以支援任何自訂的身分驗證流程。

Authentication flow diagram showing user, mobile/web app, and user pool interactions for token issuance.

一般而言,您的應用程式會產生提示,以從您的使用者收集資訊,並將API請求中的資訊提交至 Amazon Cognito 。考慮使用者集區中的InitiateAuth流程,其中已使用多重要素身分驗證 () 設定使用者MFA。

  1. 您的應用程式會提示您的使用者輸入其使用者名稱和密碼。

  2. 您可將使用者名稱和密碼作為參數包含於 InitiateAuth 中。

  3. Amazon Cognito 會傳回一個 SMS_MFA 挑戰和工作階段識別符。

  4. 您的應用程式會提示您的使用者從其手機取得MFA程式碼。

  5. 您將該代碼和工作階段識別符包含於 RespondToAuthChallenge 請求中。

根據您使用者集區的功能,您最終可能會在應用程式從 Amazon Cognito 擷取字符之前回應對 InitiateAuth 的多個挑戰。Amazon Cognito 會在每個請求的回應中包含一個工作階段字串。若要將API請求合併為身分驗證流程,請在每個後續請求中包含回應上一個請求的工作階段字串。依預設,您的使用者在工作階段字串到期前,有三分鐘的時間完成每項挑戰。如要調整此期間,請變更您的應用程式用戶端身分驗證流程工作階段持續時間。下列程序說明如何在應用程式用戶端設定中變更此設定。

注意

驗證流程工作階段持續時間設定適用於使用 Amazon Cognito 使用者集區 進行身分驗證API。Amazon Cognito 託管的使用者介面將多因素身份驗證的工作階段持續時間設定為 3 分鐘,密碼重設代碼則設定為 8 分鐘。

Amazon Cognito console
設定應用程式用戶端驗證流程工作階段持續時間 (AWS Management Console)
  1. 在使用者集區的 App integration (應用程式整合) 索引標籤,選取 App clients and analytics (應用程式用戶端和分析) 容器的應用程式用戶端名稱。

  2. 應用程式用戶端資訊 容器中選擇 編輯

  3. 以分鐘為單位,將驗證流程工作階段持續時間的值變更為代碼所需的有效性持續時間SMSMFA。這也會改變任何使用者在應用程式用戶端中完成任何驗證挑戰的時間長度。

  4. 選擇 Save changes (儲存變更)。

Amazon Cognito API
若要設定應用程式用戶端身分驗證流程工作階段持續時間 (Amazon Cognito API)
  1. 使用 DescribeUserPoolClient 請求中現有的使用者集區設定來準備 UpdateUserPoolClient 請求。您的 UpdateUserPoolClient 請求必須包含所有現有的應用程式用戶端屬性。

  2. 以分鐘為單位,將 的值AuthSessionValidity變更為代碼所需的有效期限SMSMFA。這也會改變任何使用者在應用程式用戶端中完成任何驗證挑戰的時間長度。

如需應用程式用戶端的詳細資訊,請參閱 使用應用程式用戶端的應用程式特定設定

您可以使用 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或 建立的使用者用戶端應用程式AWS SDKs

  1. 使用者在應用程式中輸入使用者名稱和密碼。

  2. 應用程式會使用使用者的使用者名稱和安全遠端密碼 (SRP) 詳細資訊呼叫 InitiateAuth操作。

    API 此操作會傳回身分驗證參數。

    注意

    應用程式會使用內建於 AWS 的 Amazon Cognito SRP功能產生SRP詳細資訊SDKs。

  3. 應用程式會呼叫 RespondToAuthChallenge 操作。如果呼叫成功,Amazon Cognito 會傳回使用者的權杖,身分驗證流程便已完成。

    如果 Amazon Cognito 需要另一個挑戰,對 RespondToAuthChallenge 的呼叫就不會傳回任何權杖。相反地,呼叫會傳回工作階段。

  4. 如果 RespondToAuthChallenge傳回工作階段,則應用程式RespondToAuthChallenge會再次呼叫,這次會使用工作階段和挑戰回應 (例如MFA程式碼)。

伺服器端身分驗證流程

如果您沒有使用者應用程式,而是使用 Java、Ruby 或 Node.js 安全後端或伺服器端應用程式,則可以使用已驗證的伺服器端API進行 Amazon Cognito 使用者集區。

如果是伺服器端應用程式,使用者集區身分驗證類似於用戶端應用程式的身分驗證,但以下除外:

  • 伺服器端應用程式會呼叫 AdminInitiateAuthAPI操作 (而非 InitiateAuth)。此操作需要具有包含 cognito-idp:AdminInitiateAuth和 許可的 AWS 憑證cognito-idp:AdminRespondToAuthChallenge。此操作會傳回必要的身分驗證參數。

  • 在伺服器端應用程式具有身分驗證參數之後,它會呼叫 AdminRespondToAuthChallengeAPI操作 (而非 RespondToAuthChallenge)。只有在您提供 AWS 憑證時,AdminRespondToAuthChallengeAPI操作才會成功。

如需使用 AWS 憑證簽署 Amazon Cognito API請求的詳細資訊,請參閱 AWS 一般參考 中的簽章第 4 版簽署程序

AdminInitiateAuthAdminRespondToAuthChallengeAPI操作無法接受 username-and-password管理員登入的使用者憑證,除非您明確地以下列其中一種方式啟用他們:

  • 當您呼叫 CreateUserPoolClientUpdateUserPoolClient 時,在 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 觸發程序建立挑戰/回應型身分驗證模型。

自訂身分驗證流程可建立自訂挑戰和回應週期,以滿足不同需求。流程一開始會呼叫 InitiateAuthAPI操作,指出要使用的身分驗證類型,並提供任何初始身分驗證參數。Amazon Cognito 會以下列其中一種資訊類型回應 InitiateAuth 呼叫:

  • 對使用者的挑戰,伴隨工作階段和參數。

  • 錯誤 (如果使用者驗證失敗)。

  • ID、存取和重新整理權杖 (如果 InitiateAuth 呼叫中提供的參數足以讓使用者登入)。(通常,使用者或應用程式必須先回答挑戰,但您的自訂程式碼必須確定這一點)。

如果 Amazon Cognito 以挑戰回應 InitiateAuth 呼叫,應用程式將會收集更多輸入,並呼叫 RespondToAuthChallenge 操作。此呼叫提供挑戰回應,並將其傳回工作階段。Amazon Cognito 回應 RespondToAuthChallenge 呼叫的方式類似於回應 InitiateAuth 呼叫。如果使用者已登入,Amazon Cognito 會提供權杖,或者如果使用者未登入,Amazon Cognito 會提供另一個挑戰,或者錯誤。如果 Amazon Cognito 傳回另一項挑戰,順序將會重複,而應用程式將會呼叫 RespondToAuthChallenge,直到使用者成功登入或傳回錯誤。如需 InitiateAuthRespondToAuthChallengeAPI操作的詳細資訊,請參閱 API 文件

內建身分驗證流程與挑戰

Amazon Cognito 包含內建 AuthFlowChallengeName值,讓標準身分驗證流程可以透過安全遠端密碼 (SRP) 通訊協定驗證使用者名稱和密碼。內建支援使用 AWS SDKsAmazon Cognito 進行這些流程。

流程一開始會傳送 USER_SRP_AUTH 作為 AuthFlowInitiateAuth。您也可以傳送 AuthParameters 中的 USERNAMESRP_A 值。如果 InitiateAuth 呼叫成功,則回應會包含 PASSWORD_VERIFIER 並將其作為在挑戰參數中的 ChallengeNameSRP_B。然後,應用程式會呼叫 RespondToAuthChallenge 搭配 PASSWORD_VERIFIER ChallengeNameChallengeResponses 中的必要參數。如果對 RespondToAuthChallenge 的呼叫成功且使用者登入,Amazon Cognito 就會發出權杖。如果您為使用者啟用了多重要素驗證 (MFA),Amazon Cognito 會傳回 ChallengeNameSMS_MFA。此應用程式可透過另一個對 RespondToAuthChallenge 的呼叫來提供必要的程式碼。

自訂身分驗證流程與挑戰

應用程式可以呼叫 InitiateAuth,並將CUSTOM_AUTH 做為 Authflow,以啟動自訂身分驗證流程。使用自訂身分驗證流程時,三個 Lambda 觸發程序會控制挑戰和回應的驗證。

  • DefineAuthChallenge Lambda 觸發程序使用以前的挑戰和回應的工作階段陣列作為輸入。然後,它產生下一個挑戰名稱和布林值,指出使用者是否通過身分驗證 (並可被授予權杖)。這個 Lambda 觸發器是一種狀態機器,可控制使用者通過挑戰的路徑。

  • CreateAuthChallenge Lambda 觸發程序會以挑戰名稱作為輸入,並產生挑戰和參數來評估回應。當 DefineAuthChallenge 傳回 CUSTOM_CHALLENGE 作為下一個挑戰,身分驗證流程將會呼叫 CreateAuthChallengeCreateAuthChallenge 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_AchallengeResult: true 的初始工作階段叫用 DefineAuthChallenge Lambda 觸發程序。您的 Lambda 函數以 challengeName: PASSWORD_VERIFIERissueTokens: falsefailAuthentication: false 回應。

  • 接下來的應用程式必須RespondToAuthChallenge呼叫 ,challengeName: PASSWORD_VERIFIER以及challengeResponses地圖SRP中 所需的其他參數。

  • 如果 Amazon Cognito 驗證密碼,RespondToAuthChallenge 會以 challengeName: PASSWORD_VERIFIERchallengeResult: 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 函數來說非常方便。若要使用這些操作並讓它們接受純文字密碼,您必須在主控台為應用程式啟用它們。或者,您可以在呼叫 CreateUserPoolClientUpdateUserPoolClient 時對 ExplicitAuthFlow 參數傳遞 ADMIN_USER_PASSWORD_AUTHInitiateAuthRespondToAuthChallenge 操作不接受 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 觸發程序匯入使用者