使用用户群体中的用户设备 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用用户群体中的用户设备

当您使用 Amazon Cognito 用户群体 API 登录本地用户群体用户时,您可以将来自高级安全特征的用户活动日志与用户的每台设备相关联,并且(可选)如果用户使用的是可信设备,也可以允许用户跳过多重身份验证(MFA)。对于任何尚未包含设备信息的登录,Amazon Cognito 都会在响应中包含设备密钥。设备密钥的格式为 Region_UUID。借助设备密钥、安全远程密码(SRP)库和允许设备身份验证的用户群体,您可以提示应用程序中的用户信任当前设备,而不再在登录时提示输入 MFA 代码。

设置记忆设备

借助 Amazon Cognito 用户群体,您可以将每个用户的设备与唯一的设备标识符(设备密钥)关联起来。当您在登录时提供设备密钥并执行设备身份验证时,您可以利用两个特征。

  1. 借助高级安全特征,您可以监控特定设备上的用户活动,以实现安全和分析目的。当用户登录时,应用程序可以选择对每个用户及其设备进行身份验证,同时将设备信息添加到其活动日志中。

  2. 记住设备功能还支持可信设备身份验证流程,其中,用户可以选择在与应用程序的安全要求相适应的时间段内不使用 MFA 即可登录。当您想要重新提示用户提交 MFA 代码时,可以更改其设备的记住状态。

    记住的设备只能在 MFA 处于活动状态的用户群体中覆盖 MFA。

当用户使用记住的设备登录时,您必须在其身份验证流程中执行额外的设备身份验证。有关更多信息,请参阅使用设备登录

在用户群体的登录体验选项卡的设备跟踪下,将用户群体配置为记住设备。通过 Amazon Cognito 控制台设置记忆设备功能时,有三种选项供您选择:Always (始终)User Opt-In (用户选择加入)No (否)

请勿记住

用户群体不会提示用户在登录时记住设备。

始终记住

当应用程序确认用户的设备时,用户群体将始终记住该设备,并且不会在将来成功登录设备时返回 MFA 质询。

用户选择加入

当应用程序确认用户的设备后,用户群体不会自动抑制 MFA 质询。您必须提示用户选择是否要记住设备。

当您选择始终记住用户选择加入时,每次用户从身份不明的设备登录时,Amazon Cognito 都会生成设备标识符密钥和机密。设备密钥是应用程序在用户执行设备身份验证时发送到用户群体的初始标识符。

对于每个已确认的用户设备,无论是自动记住还是选择加入,您都可以在每次用户登录时使用设备标识符密钥和机密对设备进行身份验证。

您还可以在 CreateUserPoolUpdateUserPool API 请求中为用户群体配置记住设备设置。有关更多信息,请参阅 DeviceConfiguration 属性。

Amazon Cognito 用户群体 API 为记住的设备提供了额外的操作。

  1. ListDevicesAdminListDevices 返回用户的设备密钥列表及其元数据。

  2. GetDeviceAdminGetDevice 返回单个设备的设备密钥和元数据。

  3. UpdateDeviceStatusAdminUpdateDeviceStatus 将用户的设备设置为已记住或未记住。

  4. ForgetDeviceAdminForgetDevice 将用户已确认的设备从其配置文件中移除。

名称以 Admin 开头的 API 操作用于服务器端应用程序,必须使用 IAM 凭证进行授权。有关更多信息,请参阅使用 Amazon Cognito 用户池 API 和用户池端点

获取设备密钥

每当用户使用用户群体 API 登录并且身份验证参数中未包含设备密钥作为 DEVICE_KEY 时,Amazon Cognito 都会在响应中返回新的设备密钥。在公共客户端应用程序中,将设备密钥放在应用程序存储中,以便您可以将其包含在将来的请求中。在机密服务器端应用程序中,使用用户的设备密钥设置浏览器 Cookie 或其它客户端令牌。

应用程序必须确认设备密钥并提供其它信息,然后用户才能使用其可信设备登录。向 Amazon Cognito 生成一个 ConfirmDevice 请求,该请求使用设备密钥、友好名称、密码验证程序和盐来确认用户的设备。如果您将用户群体配置为选择加入设备身份验证,Amazon Cognito 会在响应您的 ConfirmDevice 请求时,提示用户必须选择是否记住当前设备。对用户在 UpdateDeviceStatus 请求中选择的内容进行响应。

当您确认用户的设备但未将其设置为记住的设备时,Amazon Cognito 会存储关联,但在您提供设备密钥时继续进行非设备登录。设备可以生成对用户安全和故障排除非常有用的日志。已确认但未记住的设备不会利用登录特征,但会利用安全监控日志特征。当您为应用程序客户端激活高级安全特征并将设备占用空间编码到请求中时,Amazon Cognito 会将用户事件与已确认的设备关联起来。

获取新的设备密钥
  1. 使用 InitiateAuth API 请求开始用户的登录会话。

  2. 使用 RespondToAuthChallenge 响应所有身份验证质询,直到您收到标记用户的登录会话完成的 JSON Web 令牌(JWT)。

  3. 在应用程序中,记录 Amazon Cognito 在其 RespondToAuthChallengeInitiateAuth 响应的 NewDeviceMetadata 中返回的值:DeviceGroupKeyDeviceKey

  4. 为用户生成新的 SRP 密钥:盐和密码验证程序。此功能可在提供 SRP 库的 SDK 中使用。

  5. 提示用户输入设备名称,或根据用户的设备特征生成一个名称。

  6. ConfirmDevice API 请求中提供用户的访问令牌、设备密钥、设备名称和 SRP 密钥。如果用户群体设置为始终记住设备,则用户的注册已完成。

  7. 如果 Amazon Cognito 对于 ConfirmDevice 响应了 "UserConfirmationNecessary": true,请提示您的用户选择是否要记住该设备。如果用户确认要记住设备,请使用用户的访问令牌、设备密钥和 "DeviceRememberedStatus": "remembered" 生成 UpdateDeviceStatus API 请求。

  8. 如果您已指示 Amazon Cognito 记住该设备,那么当用户下次登录时,看到的不是 MFA 质询,而是 DEVICE_SRP_AUTH 质询。

使用设备登录

将用户的设备配置为记住后,当用户使用相同的设备密钥登录时,Amazon Cognito 不再要求用户提交 MFA 代码。设备身份验证仅用设备身份验证质询取代 MFA 身份验证质询。您不能仅使用设备身份验证登录用户。用户必须首先使用其密码或自定义质询完成身份验证。以下是在记住的设备上对用户进行身份验证的过程。

要在使用自定义身份验证质询 Lambda 触发器的流程中执行设备身份验证,请在 InitiateAuth API 请求中传递 DEVICE_KEY 参数。在用户成功完成所有质询并且 CUSTOM_CHALLENGE 质询返回的 issueTokens 值为 true 之后,Amazon Cognito 将返回一个最终 DEVICE_SRP_AUTH 质询。

使用设备登录
  1. 从客户端存储中检索用户的设备密钥。

  2. 使用 InitiateAuth API 请求开始用户的登录会话。选择一个 AuthFlowUSER_SRP_AUTHREFRESH_TOKEN_AUTHUSER_PASSWORD_AUTHCUSTOM_AUTH。在 AuthParameters 中,将用户的设备密钥添加到 DEVICE_KEY 参数中,并包括所选登录流程所需的其它参数。

    1. 您还可以在对身份验证质询的 PASSWORD_VERIFIER 响应的参数中传递 DEVICE_KEY

  3. 完成质询响应,直到您在响应中收到 DEVICE_SRP_AUTH 质询。

  4. RespondToAuthChallenge API 请求中,发送 DEVICE_SRP_AUTHChallengeName 以及 USERNAMEDEVICE_KEYSRP_A 的参数。

  5. Amazon Cognito 以 DEVICE_PASSWORD_VERIFIER 质询进行响应。此质询响应包括 SECRET_BLOCKSRP_B 的值。

  6. 使用您的 SRP 库,生成并提交 PASSWORD_CLAIM_SIGNATUREPASSWORD_CLAIM_SECRET_BLOCKTIMESTAMPUSERNAMEDEVICE_KEY 参数。在其它 RespondToAuthChallenge 请求中提交这些内容。

  7. 完成其它质询,直到收到用户的 JWT。

以下伪代码演示如何计算 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 生成的所有访问令牌中。第三方 IdP 必须为向 Amazon Cognito 进行身份验证的用户单独管理设备和 MFA。在托管 UI 中,您可以请求 aws.cognito.signin.user.admin 范围,但是托管 UI 会自动将设备信息添加到高级安全用户日志中,而不提供记住设备的功能。

显示有关设备的信息

您可以查询有关用户设备的信息,以确定设备当前是否仍在使用中。例如,您可能希望在记住的设备已有 90 天未登录后将其停用。

  • 要在公共客户端应用程序中显示用户的设备信息,请在 GetDevice API 请求中提交用户的访问密钥和设备密钥。

  • 要在机密客户端应用程序中显示用户的设备信息,请使用 Amazon 凭证签署 AdminGetDevice API 请求,然后提交用户的用户名、设备密钥和用户群体。

显示用户的所有设备的列表

您可以显示用户的所有设备及其属性的列表。例如,您可能要验证当前设备是否与记住的设备相匹配。

  • 在公共客户端应用程序中,在 ListDevices API 请求中提交用户的访问令牌。

  • 在机密客户端应用程序中,使用 Amazon 凭证签署 AdminListDevices API 请求,然后提交用户的用户名和用户群体。

忘记设备

您可以删除用户的设备密钥。当您确定您的用户不再使用设备时,或者当您检测到异常活动并希望提示用户再次完成 MFA 时,您可能需要这样做。要稍后再次注册设备,必须生成并存储新的设备密钥。

  • 在公共客户端应用程序中,在 ForgetDevice API 请求中提交用户的设备密钥和访问令牌。

  • 在机密客户端应用程序中,在 AdminForgetDevice API 请求中提交用户的设备密钥和访问令牌。