本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
身分驗證流程
使用 Amazon Cognito 使用者集區的身分驗證程序,最適合描述為使用者進行初始選擇、提交登入資料,以及回應其他挑戰的流程。當您在應用程式中實作受管登入身分驗證時,Amazon Cognito 會管理這些提示和挑戰的流程。當您在應用程式後端使用 AWS SDK 實作流程時,您必須建構請求的邏輯、提示使用者輸入,以及回應挑戰。
身為應用程式管理員,您的使用者特性、安全需求和授權模型有助於判斷您希望如何允許使用者登入。自問以下問題。
-
我想要允許使用者使用來自其他身分提供者 (IdPs登入資料登入嗎?
-
使用者名稱和密碼是否有足夠的身分驗證?
-
是否可以攔截我的使用者名稱密碼身分驗證請求? 我想要我的應用程式傳輸密碼,還是使用雜湊和 salt 交涉身分驗證?
-
我想要允許使用者略過密碼項目,並接收登入的一次性密碼嗎?
-
我想要允許使用者使用指紋、臉部或硬體安全金鑰登入嗎?
-
如果有的話,我何時需要多重要素驗證 (MFA)?
-
我想要將授權模型延伸到 Amazon Cognito 的內建功能之外嗎?
當您有這些問題的答案時,您可以了解如何啟用相關功能,並在應用程式提出的身分驗證請求中實作這些功能。
為使用者設定登入流程後,您可以使用請求 GetUserAuthFactors API 操作來檢查 MFA 和選擇型身分驗證因素的目前狀態。此操作需要使用登入使用者的存取權杖進行授權。它會傳回使用者身分驗證因素和 MFA 設定。
主題
使用第三方 IdPs登入
Amazon Cognito 使用者集區可做為 IdPs 之間身分驗證工作階段的中繼代理程式,例如 Sign in with Apple、Login with Amazon 和 OpenID Connect (OIDC) 服務。此程序也稱為聯合登入或聯合身分驗證。聯合身分驗證不會利用您可以在應用程式用戶端中建置的任何身分驗證流程。反之,您可以將設定的使用者集區 IdPs指派給應用程式用戶端。當使用者在受管登入中選取其 IdP,或您的應用程式調用重新導向至其 IdP 登入頁面的工作階段時,就會發生聯合登入。
使用聯合登入,您可以將主要和 MFA 身分驗證因素委派給使用者的 IdP。除非您將聯合身分使用者連結至本機使用者,否則 Amazon Cognito 不會將本節中的其他進階流程新增至該使用者。 將聯合身分使用者連結至現有的使用者描述檔未連結的聯合身分使用者具有使用者名稱,但它們是映射屬性資料的存放區,通常不會用於與瀏覽器型流程無關的登入。
實作資源
使用持久性密碼登入
在 Amazon Cognito 使用者集區中,每個使用者都有使用者名稱。這可能是電話號碼、電子郵件地址,或選擇或管理員提供的識別符。此類型的使用者可以使用使用者名稱及其密碼登入,並選擇性地提供 MFA。使用者集區可以使用公有或 IAM 授權的 API 操作和 SDK 方法執行使用者名稱密碼登入。您的應用程式可以直接將密碼傳送到您的使用者集區以進行身分驗證。您的使用者集區會回應額外的挑戰或 JSON Web 字符 (JWTs),這是身分驗證成功的結果。
使用持久性密碼和安全承載登入
使用者集區中的另一種使用者名稱密碼登入方法形式是使用安全遠端密碼 (SRP) 通訊協定。此選項會傳送使用者集區可驗證的密碼 — 密碼雜湊和 salt — 知識證明。在對 Amazon Cognito 的請求中沒有可讀取的秘密資訊,您的應用程式是唯一可處理使用者輸入密碼的實體。SRP 身分驗證涉及數學計算,最好由您可以在 SDK 中匯入的現有元件完成。低階 AWS SDKs 會公開 InitiateAuth和 RespondToAuthChallenge API 操作,但不會為您計算 SRP 值。實作 SRP 的高階程式庫,例如 Amplify 程式庫,會執行這些計算。如果您的 SDK 不提供 SRP 實作,您必須在呼叫這些操作之前自行計算 SRP 值。SRP 通常在用戶端應用程式中實作,例如行動應用程式。如需通訊協定的詳細資訊,請參閱 Stanford SRP 首頁
Amazon Cognito 身分驗證的 initiate-challenge-respond 序列會使用 SRP 驗證使用者及其密碼。您必須將使用者集區和應用程式用戶端設定為支援 SRP 身分驗證,然後在應用程式中實作登入請求和挑戰回應的邏輯。您的 SRP 程式庫可以產生隨機數字和計算值,向您的使用者集區示範您擁有使用者的密碼。您的應用程式會將這些計算值填入 Amazon Cognito 使用者集區 API 操作AuthParameters和 SDK 方法中的 JSON 格式和ChallengeParameters欄位,以進行身分驗證。
使用一次性密碼的無密碼登入
密碼可能會遺失或遭竊。您可能只想驗證您的使用者是否可以存取已驗證的電子郵件地址、電話號碼或驗證器應用程式。解決方案是無密碼登入。您的應用程式可以提示使用者輸入其使用者名稱、電子郵件地址或電話號碼。然後,Amazon Cognito 會產生一次性密碼 (OTP),這是他們必須確認的代碼。成功的程式碼會完成身分驗證。
一次性密碼 (OTP) 身分驗證流程與使用者集區中所需的多重要素驗證 (MFA) 不相容。當您將 FactorConfiguration設定為 時,具有使用者驗證的通行金鑰身分驗證可以滿足 MFA 要求MULTI_FACTOR_WITH_USER_VERIFICATION。如果您的使用者集區中是選用的 MFA,則已啟用 MFA 的使用者無法使用 OTP 第一因素登入。在 MFA 選用使用者集區中沒有 MFA 偏好設定的使用者可以使用無密碼因素登入。如需詳細資訊,請參閱使用者集區 MFA 的須知事項。
當使用者在無密碼身分驗證中正確輸入在簡訊或電子郵件訊息中收到的代碼時,除了驗證使用者之外,您的使用者集區還會將使用者的未驗證電子郵件地址或電話號碼屬性標記為已驗證。無論您將使用者集區設定為自動驗證電子郵件地址或電話號碼CONFIRMED,使用者狀態也會從 UNCONFIRMED 變更為 。
使用無密碼登入的新選項
當您在使用者集區中啟用無密碼身分驗證時,它會變更某些使用者流程的運作方式。
-
使用者可以在沒有密碼的情況下註冊,並在登入時選擇無密碼因素。您也可以建立沒有密碼的使用者做為管理員。
-
您使用 CSV 檔案匯入的使用者可以使用無密碼因素立即登入。他們不需要在登入之前設定密碼。
-
沒有密碼的使用者可以在沒有
PreviousPassword參數的情況下提交 ChangePassword API 請求。
使用 OTPs 自動登入
使用電子郵件或簡訊 OTPs 註冊和確認其使用者帳戶的使用者,可以使用與其確認訊息相符的無密碼因素自動登入。在受管登入 UI 中,確認其帳戶且有資格使用確認碼交付方法進行 OTP 登入的使用者,會在提供確認碼後自動繼續第一次登入。在具有 AWS SDK 的自訂應用程式中,將下列參數傳遞至 InitiateAuth 或 AdminInitiateAuth 操作。
-
ConfirmSignUp API 回應中的
Session參數做為Session請求參數。 -
的 AuthFlow
USER_AUTH。
您可以傳遞 PREFERRED_CHALLENGE EMAIL_OTP或 SMS_OTP,但這不是必要的。Session 參數提供身分驗證證明,當您傳遞有效的工作階段程式碼AuthParameters時,Amazon Cognito 會忽略 。
登入操作會傳回表示身分驗證成功、AuthenticationResult 的回應,如果下列條件為 true,則沒有額外的挑戰。
-
Session代碼有效且未過期。 -
使用者符合 OTP 身分驗證方法的資格。
使用 WebAuthn 通行金鑰進行無密碼登入
通行密鑰是安全的,並對使用者施加相對較低的工作量。Passkey 登入使用身分驗證器,這是使用者可以進行身分驗證的外部裝置。一般密碼會讓使用者暴露在網路釣魚、密碼猜測和憑證遭竊等漏洞中。使用通行密鑰,您的應用程式可以受益於行動電話和其他連接至或內建於資訊系統的裝置上的進階安全措施。常見的通行金鑰登入工作流程會從呼叫您的密碼或登入資料管理員的裝置呼叫開始,例如 iOS Keychain 或 Google Chrome 密碼管理員。裝置登入資料管理員會提示他們選取通行金鑰,並使用現有的登入資料或裝置解鎖機制進行授權。現代手機具有臉部掃描器、指紋掃描器、解鎖模式和其他機制,有些同時滿足您已知的內容,以及具有強大身分驗證原則的內容。如果使用生物識別特徵進行通行金鑰身分驗證,通行金鑰代表您的身分。
您可能想要使用指紋、臉部或安全金鑰身分驗證取代密碼。這是 passkey 或 WebAuthn 身分驗證。應用程式開發人員通常會允許使用者在第一次使用密碼登入後註冊生物識別裝置。透過 Amazon Cognito 使用者集區,您的應用程式可以為使用者設定此登入選項。當您的使用者集區FactorConfiguration設定為 時,通行金鑰身分驗證可以滿足多重要素身分驗證 (MFA) 要求MULTI_FACTOR_WITH_USER_VERIFICATION。在此組態中,具有使用者驗證的通行金鑰身分驗證會計為多重要素身分驗證。
一次性密碼 (OTP) 身分驗證流程與使用者集區中所需的多重要素驗證 (MFA) 不相容。當您將 FactorConfiguration設定為 時,具有使用者驗證的通行金鑰身分驗證可以滿足 MFA 要求MULTI_FACTOR_WITH_USER_VERIFICATION。如果您的使用者集區中是選用的 MFA,則已啟用 MFA 的使用者無法使用 OTP 第一因素登入。在 MFA 選用使用者集區中沒有 MFA 偏好設定的使用者可以使用無密碼因素登入。如需詳細資訊,請參閱使用者集區 MFA 的須知事項。
什麼是通行密鑰?
Passkeys 無需記住複雜的密碼或輸入 OTPs即可簡化使用者體驗。Passkey 是以全球資訊網協會
當使用者向網站或應用程式註冊驗證器時,驗證器會建立公有/私有金鑰對。WebAuthn 瀏覽器和平台會將公有金鑰提交至網站或應用程式後端的應用程式。驗證器會保留有關使用者和應用程式的私有金鑰、金鑰 IDs 和中繼資料。當使用者想要在已註冊應用程式中使用其已註冊的驗證器進行驗證時,應用程式會產生隨機挑戰。此挑戰的回應是該應用程式和使用者的驗證器私有金鑰所產生的挑戰數位簽章,以及相關的中繼資料。瀏覽器或應用程式平台會收到數位簽章,並將其傳遞給應用程式後端。然後,應用程式會使用存放的公有金鑰驗證簽章。
注意
您的應用程式不會收到使用者提供給身分驗證器的任何身分驗證秘密,也不會收到私有金鑰的相關資訊。
以下是目前市場上驗證者的一些範例和功能。驗證者可能符合任何或所有這些類別。
-
有些驗證者會在授予存取權之前,使用 PIN 碼、臉部或指紋的生物識別輸入或密碼等因素執行使用者驗證,確保只有合法使用者才能授權動作。其他驗證器沒有任何使用者驗證功能,有些可在應用程式不需要時略過使用者驗證。
-
有些驗證器,例如 YubiKey 硬體字符,是可攜式的。它們會透過 USB、藍牙或 NFC 連線與裝置通訊。有些驗證者是本機身分並繫結至平台,例如 PC 上的 Windows Hello 或 iPhone 上的 Face ID。裝置繫結驗證器可以由使用者攜帶,如果夠小,就像行動裝置一樣。有時,使用者可以透過無線通訊,將硬體驗證器與許多不同的平台連線。例如,桌面瀏覽器中的使用者在掃描 QR 碼時,可以使用其智慧型手機做為通行金鑰驗證器。
-
有些平台繫結的通行金鑰會同步至雲端,以便從多個位置使用。例如,iPhones上的 Face ID 通行金鑰會將通行金鑰中繼資料與其 iCloud Keychain 中的使用者 Apple 帳戶同步。這些通行金鑰會在 Apple 裝置之間授予無縫身分驗證,而不是要求使用者獨立註冊每個裝置。軟體型驗證器應用程式,例如 1Password、Dashlane 和 Bitwarden 同步通行金鑰,涵蓋使用者已安裝應用程式的所有平台。
在 WebAuthn 術語中,網站和應用程式依賴各方。每個通行金鑰都與特定的依賴方 ID 相關聯,這是一個統一的識別符,代表接受通行金鑰身分驗證的網站或應用程式。開發人員必須仔細選取其依賴方 ID,才能擁有正確的身分驗證範圍。典型的依賴方 ID 是 Web 伺服器的根網域名稱。具有此依賴方 ID 規格的通行金鑰可以驗證該網域和子網域。當使用者想要存取的網站 URL 與依賴方 ID 不相符時,瀏覽器和平台會拒絕通行金鑰身分驗證。同樣地,對於行動應用程式,只有在應用程式在依存方 ID 指示的路徑中提供的.well-known關聯檔案中存在應用程式路徑時,才能使用通行金鑰。
通行金鑰是可探索的。瀏覽器或平台可以自動識別和使用它們,而無需使用者輸入使用者名稱。當使用者造訪支援通行金鑰身分驗證的網站或應用程式時,可以從瀏覽器或平台已知的通行金鑰清單中選擇,也可以掃描 QR 碼。
Amazon Cognito 如何實作通行金鑰身分驗證?
通行金鑰是一種選擇加入功能,除了 Lite 之外,所有功能計劃皆可使用。它僅適用於以選擇為基礎的身分驗證流程。透過受管登入,Amazon Cognito 會處理通行金鑰身分驗證的邏輯。您也可以在 SDKs 中使用 AWS Amazon Cognito 使用者集區 API,在您的應用程式後端執行通行金鑰身分驗證。
Amazon Cognito 會辨識使用兩種非對稱密碼編譯演算法之一建立的密碼金鑰:ES256(-7) 和 RS256(-257)。大多數驗證程式都支援這兩種演算法。根據預設,使用者可以設定任何類型的驗證器,例如硬體字符、手機和軟體驗證器應用程式。Amazon Cognito 目前不支援認證
在您的使用者集區中,您可以將使用者驗證設定為偏好或必要。在未提供值的 API 請求中,此設定預設為偏好,在 Amazon Cognito 主控台中預設會選取偏好。當您將使用者驗證設定為偏好時,使用者可以設定沒有使用者驗證功能的驗證器,而且註冊和驗證操作可以在沒有使用者驗證的情況下成功。若要在通行金鑰註冊和身分驗證中強制使用者驗證,請將此設定變更為必要。
您在通行金鑰組態中設定的依賴方 (RP) ID 是重要的決策。當您未另外指定 ,且您的網域品牌版本是受管登入時,您的使用者集區預設為預期您的自訂網域名稱做為 RP ID。如果您沒有自訂網域且未以其他方式指定,您的使用者集區會預設為字首網域的 RP ID。您也可以將 RP ID 設定為不在公有字尾清單 (PSL) 中的任何網域名稱。您的 RP ID 項目適用於受管登入和 SDK 身分驗證中的通行金鑰註冊和身分驗證。只有在 Amazon Cognito 能夠以.well-known您的 RP ID 做為網域時,Passkey 才能在行動應用程式中運作。最佳實務是在網站或應用程式可公開使用之前,判斷並設定依賴方 ID 的值。如果您變更 RP ID,您的使用者必須使用新的 RP ID 再次註冊。
每個使用者最多可以註冊 20 個通行金鑰。他們至少登入您的使用者集區一次後,才能註冊通行金鑰。受管登入會從通行金鑰註冊中移除大量工作。當您為使用者集區和應用程式用戶端啟用通行金鑰驗證時,具有受管登入網域的使用者集區會提醒最終使用者在註冊新使用者帳戶後註冊通行金鑰。您也可以隨時叫用使用者的瀏覽器,將使用者導向受管登入頁面以進行通行金鑰註冊。使用者必須提供使用者名稱,Amazon Cognito 才能啟動通行金鑰身分驗證。受管登入會自動處理。登入頁面會提示輸入使用者名稱,驗證使用者至少已註冊一個通行金鑰,然後提示輸入通行金鑰登入。同樣地,以 SDK 為基礎的應用程式必須提示輸入使用者名稱,並在身分驗證請求中提供該使用者名稱。
當您使用通行金鑰設定使用者集區身分驗證,且您擁有自訂網域和字首網域時,RP ID 會預設為自訂網域的完整網域名稱 (FQDN)。若要在 Amazon Cognito 主控台中將字首網域設定為 RP ID,請刪除您的自訂網域,或將字首網域的 FQDN 輸入為第三方網域。
登入後的 MFA
您可以設定使用使用者名稱密碼流程完成登入的使用者,以提示使用來自電子郵件訊息、簡訊或程式碼產生應用程式的一次性密碼進行其他驗證。MFA 與使用一次性密碼的無密碼登入不同。不過,當您在使用者集區 FactorConfigurationMULTI_FACTOR_WITH_USER_VERIFICATION中將 設定為 時,具有使用者驗證的通行金鑰可以滿足 MFA 要求做為首要因素WebAuthnConfiguration。通行金鑰不能用作密碼登入的第二個因素。對於密碼型流程,使用者集區中的 MFA 是一種挑戰回應模型,其中使用者首先示範他們知道密碼,然後示範他們有權存取其註冊的第二因素裝置。
實作資源
重新整理權杖
當您想要讓使用者在不重新輸入登入資料的情況下保持登入狀態時,重新整理權杖是您的應用程式必須保留使用者工作階段的工具。應用程式可以將重新整理字符呈現到您的使用者集區,並交換為新的 ID 和存取字符。透過權杖重新整理,您可以確保登入使用者仍處於作用中狀態、取得更新的屬性資訊,以及更新存取控制權利,而無需使用者介入。
實作資源
自訂身分驗證
您可能想要為未列於此處的使用者設定身分驗證方法。您可以使用 Lambda 觸發器的自訂身分驗證來執行此操作。在一系列 Lambda 函數中,Amazon Cognito 發出挑戰、詢問使用者必須回答的問題、檢查答案的準確性,然後判斷是否應該發出另一個挑戰。問題和答案可能包括安全問題、對 CAPTCHA 服務的請求、對外部 MFA 服務 API 的請求,或這些項目的序列。
實作資源
自訂身分驗證流程
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 文件。
自訂身分驗證流程與挑戰
應用程式可以呼叫 InitiateAuth,並將CUSTOM_AUTH 做為 Authflow,以啟動自訂身分驗證流程。使用自訂身分驗證流程時,三個 Lambda 觸發程序會控制挑戰和回應的驗證。
-
DefineAuthChallengeLambda 觸發程序使用以前的挑戰和回應的工作階段陣列作為輸入。然後,它產生下一個挑戰名稱和布林值,指出使用者是否通過身分驗證 (並可被授予權杖)。這個 Lambda 觸發器是一種狀態機器,可控制使用者通過挑戰的路徑。 -
CreateAuthChallengeLambda 觸發程序會以挑戰名稱作為輸入,並產生挑戰和參數來評估回應。當DefineAuthChallenge傳回CUSTOM_CHALLENGE作為下一個挑戰,身分驗證流程將會呼叫CreateAuthChallenge。CreateAuthChallengeLambda 觸發程序會在挑戰中繼資料參數中傳遞下一個挑戰類型。 -
VerifyAuthChallengeResponseLambda 函數會評估回應,並傳回布林值,指出回應是否有效。
自訂驗證流程也可以結合內建挑戰,例如 SRP 密碼驗證和透過 SMS 的 MFA。它可以使用自訂挑戰,如 CAPTCHA 或秘密提示問題。
在自訂身分驗證流程中使用 SRP 密碼驗證
如果您想要將 SRP 包含在自訂身分驗證流程中,就需要從 SRP 開始。
-
若要在自訂流程中起始 SRP 密碼驗證,應用程式會呼叫
InitiateAuth並以CUSTOM_AUTH為Authflow。在AuthParameters地圖中,來自您的應用程式的請求包含SRP_A:(SRP A 值) 和CHALLENGE_NAME: SRP_A。 -
CUSTOM_AUTH流程會以challengeName: SRP_A和challengeResult: true的初始工作階段叫用DefineAuthChallengeLambda 觸發程序。您的 Lambda 函數以challengeName: PASSWORD_VERIFIER、issueTokens: false和failAuthentication: false回應。 -
應用程式接下來需要用
challengeName: PASSWORD_VERIFIER呼叫RespondToAuthChallenge和challengeResponses映射中 SRP 所需的其他參數。 -
如果 Amazon Cognito 驗證密碼,
RespondToAuthChallenge會以challengeName: PASSWORD_VERIFIER和challengeResult: true的第二個工作階段叫用DefineAuthChallengeLambda 觸發程序。到時DefineAuthChallengeLambda 觸發程序可以回應challengeName: CUSTOM_CHALLENGE以開始自訂挑戰。 -
如果為使用者啟用 MFA,則 Amazon Cognito 驗證密碼後,便會要求使用者設定或使用 MFA 登入。
注意
Amazon Cognito 託管的登入網頁無法啟用 自訂身分驗證挑戰 Lambda 觸發程序。
如需 Lambda 觸發器的詳細資訊,包括範本程式碼,請參閱 使用 Lambda 觸發程序來自訂使用者集區工作流程。
使用者遷移身分驗證流程
使用者遷移 Lambda 觸發程序有助於將使用者從舊式使用者管理系統遷移到使用者集區。如果您選擇 USER_PASSWORD_AUTH 身分驗證流程,使用者就不必使用者遷移期間重設密碼。此流程會在驗證期間透過加密的 SSL 連線,將您的使用者密碼傳送至服務。
當您已遷移所有使用者時,請將流程切換至更安全的 SRP 流程。SRP 流程不會透過網路傳送任何密碼。
若要進一步了解 Lambda 觸發程序,請參閱使用 Lambda 觸發程序來自訂使用者集區工作流程。
如需使用 Lambda 觸發程序來遷移使用者的詳細資訊,請參閱透過使用者遷移 Lambda 觸發程序匯入使用者。