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

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

使用者集區身分驗證流程

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

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

Public authentication

InitiateAuth並未RespondToAuthChallenge經驗證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. 選擇儲存變更

Amazon Cognito API
設定應用程式用戶端驗證流程工作階段持續時間 (Amazon CognitoAPI)
  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作業會傳回驗證參數。

    注意

    該應用程序使用內置的 Amazon Cognito SRP 功能生成SRP詳細信息。 AWS 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 包含內建ChallengeNameAuthFlow和值,因此標準身份驗證流程可以透過安全遠端密碼 (SRP) 通訊協定驗證使用者名稱和密碼。對這些流程的 AWS SDKs內置支持與 Amazon 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_AUTHAuthflow. 在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_VERIFIERchallengeResponses地圖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 觸發程序將使用者匯入到使用者集區