在使用者集區中使用使用者裝置 - 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 (否)

不要記住

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

永遠記住

當您的應用程式確認使用者的裝置時,您的使用者集區一律會記住裝置,而且不會在未來成功登入裝置時傳回MFA挑戰。

使用者選擇加入

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

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

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

您也可以在 CreateUserPoolUpdateUserPoolAPI請求中為使用者集區設定記住的裝置設定。如需詳細資訊,請參閱 DeviceConfiguration 屬性。

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

  1. ListDevicesAdminListDevices傳回使用者的裝置金鑰及其中繼資料清單。

  2. GetDeviceAdminGetDevice傳回單一裝置的裝置金鑰和中繼資料。

  3. UpdateDeviceStatus 並將AdminUpdateDeviceStatus使用者的裝置設定為已記住或不記得。

  4. ForgetDevice 並從其設定檔AdminForgetDevice中移除使用者的確認裝置。

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,請提示您的使用者選擇是否要記住裝置。如果他們確認想要記住裝置,請使用使用者的存取權杖、裝置金鑰和 產生UpdateDeviceStatusAPI請求"DeviceRememberedStatus": "remembered"

  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請求中,傳送 ChallengeNameDEVICE_SRP_AUTHUSERNAMEDEVICE_KEY和 的參數SRP_A

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

  6. 使用您的SRP程式庫,產生並提交 PASSWORD_CLAIM_SIGNATUREPASSWORD_CLAIM_SECRET_BLOCKUSERNAMETIMESTAMPDEVICE_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請求中提交使用者的裝置金鑰和存取權杖。