在使用者集區中使用使用者裝置 - Amazon Cognito

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

在使用者集區中使用使用者裝置

當您使用 Amazon Cognito 使用者集區登入本機使用者集區使用者時API,您可以將來自進階安全功能的使用者活動日誌與其每個裝置建立關聯;如果使用者位於受信任的裝置上,則允許使用者略過多因素身份驗證 (MFA)。Amazon Cognito 會針對任何尚未包含裝置資訊的登入,在回應中包含裝置金鑰。裝置金鑰的格式為 Region_UUID。使用設備密鑰,安全遠程密碼(SRP)庫和允許設備身份驗證的用戶池,您可以提示應用程序中的用戶信任當前設備,並且在登錄時不再提示輸入MFA代碼。

設定記住的裝置

使用 Amazon Cognito 使用者集區,您就可以將使用者的每一部裝置與唯一裝置識別碼 (也就是裝置金鑰) 建立關聯。當您在登入時出示裝置金鑰並執行裝置身分驗證時,可以利用兩項功能。

  1. 基於安全和分析目的,您可以利用進階安全功能監控特定裝置上的使用者活動。當使用者登入時,您的應用程式可以選擇對每一位使用者及其裝置進行身分驗證,並將裝置資訊新增至使用者的活動日誌。

  2. 記住設備還支持受信任的設備身份驗證流程,您的用戶可以選擇在以後不使用的情況下MFA登錄,這取決於您的應用程序的安全性要求或用戶的偏好設置。例如,您的應用程式可能會提示使用者信任裝置 30、60 或 90 天。您可以將此日期存儲在自定義屬性中,並在該日期更改其設備的記住狀態。然後,您必須重新提示用戶提交MFA代碼,並將設備設置為成功驗證後再次記住該設備。

    記住的裝置MFA只能在使用MFA作用中的使用者集區中覆寫。

當您的使用者使用記住的裝置登入時,您必須在其身分驗證流程中執行額外的裝置身分驗證。如需詳細資訊,請參閱使用裝置登入

在使用者集區的登入體驗索引標籤中,於裝置追蹤下設定您的使用者集區以記住裝置。透過 Amazon Cognito 主控台來設定記住的裝置功能時,您有三個選項:Always (一律)User Opt-In (使用者選擇記住)No (否)

不要記住

您的使用者集區不會在登入時提示使用者記住裝置。

永遠記住

當您的應用程序確認用戶的設備時,您的用戶池始終會記住該設備,並且不會在 future 成功登錄設備時返回MFA挑戰。

使用者選擇加入

當您的應用程序確認用戶的設備時,您的用戶池不會自動抑制MFA挑戰。您必須提示使用者選擇是否要記住裝置。

若您選擇永遠記住使用者選擇加入,每次使用者從無法辨識的裝置登入時,Amazon Cognito 都會產生裝置識別碼金鑰和秘密。裝置金鑰是使用者執行裝置身分驗證時,您的應用程式傳送至使用者集區的初始識別碼。

無論使用者裝置是自動記住或選擇加入,一經確認後,您就可以使用裝置識別碼金鑰和秘密在每次使用者登入時進行裝置身分驗證。

您也可以為或要求中的使用者集區設定記憶裝置設定。CreateUserPoolUpdateUserPoolAPI若要取得更多資訊,請參閱DeviceConfiguration性質。

Amazon Cognito 使用者集區對API已記住的裝置還有其他操作。

  1. ListDevicesAdminListDevices返回用戶的設備密鑰及其元數據的列表。

  2. GetDeviceAdminGetDevice返回單個設備的設備密鑰和元數據。

  3. UpdateDeviceStatusAdminUpdateDeviceStatus將用戶的設備設置為已記住或不記住。

  4. ForgetDeviceAdminForgetDevice從使用者的設定檔中移除使用者確認的裝置。

API名稱開頭為的作業可用Admin於伺服器端應用程式,且必須使用IAM認證進行授權。如需詳細資訊,請參閱使用使用者集區API和授權伺服器

取得裝置金鑰

只要您的使用者使用使用者集區登入API且身份驗證參數中未包含裝置金鑰DEVICE_KEY,Amazon Cognito 就會在回應中傳回新的裝置金鑰。在您的公有用戶端應用程式中,將裝置金鑰放入應用程式儲存中,您就可以在後續請求中包含該金鑰。在機密伺服器端應用程式中,使用您使用者的裝置金鑰設定瀏覽器 Cookie 或其他用戶端權杖。

您的應用程式必須先確認裝置金鑰並提供其他資訊,您的使用者才能使用其受信任的裝置登入。向 Amazon Cognito 產生ConfirmDevice請求,以裝置金鑰、易記名稱、密碼驗證程式和 salt 來確認使用者的裝置。如果您設定使用者集區進行選擇加入裝置身分驗證,Amazon Cognito 會回應您的 ConfirmDevice 請求,並提示您的使用者必須選擇是否要記住目前的裝置。回應使用者在UpdateDeviceStatus請求中的選擇。

若您確認使用者的裝置,但未將其設定為記住,Amazon Cognito 會儲存關聯,但是在您提供裝置金鑰時,會進行非裝置登入。裝置可以產生日誌,對於使用者安全和疑難排解來說很實用。已確認但未記住的裝置不會利用登入功能,而是利用安全監控日誌功能。當您為應用程式用戶端啟用進階安全功能,並將裝置用量編碼到請求中時,Amazon Cognito 會將使用者事件與已確認的裝置建立關聯。

取得新的裝置金鑰
  1. 透過InitiateAuthAPI要求開始使用者的登入工作階段。

  2. 回應所有身份驗證挑戰,RespondToAuthChallenge直到您收到標記用戶登錄會話完成的 JSON Web 令牌(JWTs)。

  3. 在您的應用程式中,記錄 Amazon Cognito 在其 RespondToAuthChallengeInitiateAuth 回應中的 NewDeviceMetadata 傳回的值:DeviceGroupKeyDeviceKey

  4. 為您的用戶生成一個新SRP密碼:salt 和密碼驗證程序。此功能在提供SRP庫中SDKs可用。

  5. 提示您的使用者輸入裝置名稱,或根據使用者裝置的特性產生名稱。

  6. ConfirmDeviceAPI請求中提供用戶的訪問令牌,設備密鑰,設備名稱和SRP密鑰。如果您的使用者集區設定為永遠記住裝置,表示您的使用者註冊已完成。

  7. 如果 Amazon Cognito 以 "UserConfirmationNecessary": true 回應 ConfirmDevice,請提示您的使用者選擇是否要記住裝置。如果他們確認要記住該設備,請使用您的用戶的訪問令牌,設備密鑰和"DeviceRememberedStatus": "remembered"生成UpdateDeviceStatusAPI請求。

  8. 如果您已指示 Amazon Cognito 記住裝置,則在他們下次登入時,而不是MFA挑戰,他們就會面臨挑戰。DEVICE_SRP_AUTH

使用裝置登入

設定要記住的使用者裝置後,Amazon Cognito 不再要求他們在使用相同裝置金鑰登入時提交MFA代碼。裝置驗證只會以裝置MFA驗證挑戰取代-驗證挑戰。您無法只使用裝置身分驗證讓使用者登入。您的使用者必須先使用其密碼或自訂挑戰完成身分驗證。以下是使用者在記住的裝置上進行身分驗證的程序。

若要在使用自訂驗證挑戰 Lambda 觸發程序的流程中執行裝置驗證,請在InitiateAuthAPI請求中傳遞DEVICE_KEY參數。在使用者成功通過所有挑戰,且 CUSTOM_CHALLENGE 挑戰傳回的 issueTokenstrue 之後,Amazon Cognito 就會傳回最後一項 DEVICE_SRP_AUTH 挑戰。

使用裝置登入
  1. 從用戶端儲存擷取使用者的裝置金鑰。

  2. 透過InitiateAuthAPI要求開始使用者的登入工作階段。選擇 USER_SRP_AUTHREFRESH_TOKEN_AUTHUSER_PASSWORD_AUTHCUSTOM_AUTHAuthFlow。在 AuthParameters 中,將使用者的裝置金鑰新增至 DEVICE_KEY 參數,並包含所選登入流程的其他必要參數。

    1. 您也可以在 PASSWORD_VERIFIER 回應的參數中,將 DEVICE_KEY 傳遞至身分驗證挑戰。

  3. 完成挑戰回應,直到您在回應中收到 DEVICE_SRP_AUTH 挑戰為止。

  4. RespondToAuthChallengeAPI請求中,傳送USERNAMEDEVICE_SRP_AUTHDEVICE_KEYChallengeName的和參數SRP_A

  5. Amazon Cognito 會以 DEVICE_PASSWORD_VERIFIER 挑戰回應。此挑戰回應包括 SECRET_BLOCKSRP_B 的值。

  6. 使用您的SRP程式庫,產生並提交PASSWORD_CLAIM_SIGNATUREPASSWORD_CLAIM_SECRET_BLOCKTIMESTAMPUSERNAME、和DEVICE_KEY參數。在另一個 RespondToAuthChallenge 請求中提交這些參數。

  7. 完成額外的挑戰,直到您收到使用者JWTs。

下列虛擬程式碼示範如何計算 DEVICE_PASSWORD_VERIFIER 挑戰回應的值。

PASSWORD_CLAIM_SECRET_BLOCK = SECRET_BLOCK TIMESTAMP = Tue Sep 25 00:09:40 UTC 2018 PASSWORD_CLAIM_SIGNATURE = Base64(SHA256_HMAC(K_USER, DeviceGroupKey + DeviceKey + PASSWORD_CLAIM_SECRET_BLOCK + TIMESTAMP)) K_USER = SHA256_HASH(S_USER) S_USER = (SRP_B - k * gx)(a + ux) x = SHA256_HASH(salt + FULL_PASSWORD) u = SHA256_HASH(SRP_A + SRP_B) k = SHA256_HASH(N + g)

檢視、更新和忘記裝置

您可以使用 Amazon Cognito API 在您的應用程式中實作下列功能。

  1. 顯示有關使用者目前裝置的資訊。

  2. 顯示使用者所有裝置的清單。

  3. 忘記裝置。

  4. 更新裝置的記住狀態。

授權下列說明中API要求的存取權杖必須包含aws.cognito.signin.user.admin範圍。Amazon Cognito 會將此範圍的宣告新增至您使用 Amazon Cognito 使用者集區產生的所有存取權杖。API第三方 IdPs 必須分別管理裝置和MFA向 Amazon Cognito 進行驗證的使用者管理。在託管 UI 中,您可以請求 aws.cognito.signin.user.admin 範圍,但託管 UI 會自動將裝置資訊新增至進階安全使用者日誌,且不會提議記住裝置。

顯示有關裝置的資訊

您可以查詢有關使用者裝置的資訊,以判斷該裝置目前是否仍在使用中。例如,您可能希望在記住的裝置未登入長達 90 天後,將裝置停用。

  • 若要在公用用戶端應用程式中顯示使用者的裝置資訊,請在要求中提交使用者的存取金鑰和裝置金鑰。GetDeviceAPI

  • 若要在機密用戶端應用程式中顯示使用者的裝置資訊,請使用 AWS 認證簽署AdminGetDeviceAPI要求,然後提交使用者的使用者名稱、裝置金鑰和使用者集區。

顯示使用者所有裝置的清單

您可以顯示使用者所有裝置及其屬性的清單。例如,您可能希望驗證目前的裝置是否與記住的裝置相符。

  • 在公共客戶端應用程序中,在請求中提交用戶的訪問令牌。ListDevicesAPI

  • 在機密客戶端應用程序中,使用 AWS 憑據簽署AdminListDevicesAPI請求,然後提交用戶的用戶名和用戶池。

忘記裝置

您可以刪除使用者的裝置金鑰。當您判斷使用者不再使用裝置,或是偵測到異常活動並想要提示使用者MFA再次完成時,您可能會想要這麼做。若稍後要再次註冊裝置,您必須產生並儲存新的裝置金鑰。

  • 在公共客戶端應用程序中,在請求中提交用戶的設備密鑰和訪問令牌。ForgetDeviceAPI

  • 在機密客戶端應用程序中,在請求中提交用戶的設備密鑰和訪問令牌。AdminForgetDeviceAPI