AWS CLI cognito-idp confirm-device 实战:在 Cognito 用户池中确认并记住用户设备
【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli
本文基于 aws-cli 仓库中的官方示例文档 confirm-device.rst 展开,讲解aws cognito-idp confirm-device命令的作用场景、完整调用示例与参数细节,并结合仓库内置的服务模型文件 service-2.json 深入说明请求/响应结构、SRP 设备密钥验证机制与授权模型,帮助读者在集成 Amazon Cognito 用户池时正确实现“记住此设备(Remember me on this device)”功能。
什么是 confirm-device:Cognito 的设备跟踪能力
在 Amazon Cognito 用户池中,当用户池启用了设备跟踪(Device tracking)时,应用可以在用户首次登录后向 Cognito 注册一台“设备”。确认后的设备会获得一个可信状态,之后该用户在这台设备上再次登录时,Cognito 允许使用设备密钥(device key)在后端完成认证,而不必每次都要求用户输入 MFA 验证码——这就是用户界面上常见的“Remember me on this device”选项的底层实现。
confirm-device对应的 API 操作为ConfirmDevice,其语义是“确认一个用户想要记住的设备”(Confirms a device that a user wants to remember)。在 service-2.json 中,该操作定义为POST /的 HTTP 请求,输入结构为ConfirmDeviceRequest,输出结构为ConfirmDeviceResponse。
完整示例:为一台新设备执行确认
仓库示例文档给出的完整命令如下,用于为当前已登录用户添加一台新的记住设备:
aws cognito-idp confirm-device \ --access-token eyJra456defEXAMPLE \ --device-key us-west-2_a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \ --device-secret-verifier-config PasswordVerifier=TXlWZXJpZmllclN0cmluZw,Salt=TXlTUlBTYWx0各参数的含义:
| 参数 | 必填 | 说明 |
|---|---|---|
--access-token | 是 | 当前已登录用户持有的有效访问令牌,必须包含aws.cognito.signin.user.admin这个 scope 声明(见下文“授权模型”一节)。 |
--device-key | 是 | 设备唯一标识(device key),即要更新/确认状态的设备的唯一标识符。示例中us-west-2_a1b2c3d4-...这种带区域前缀的 UUID 是 Cognito 设备密钥的典型格式,通常通过associate-sign-in-with-device等操作获取。 |
--device-secret-verifier-config | 否 | 设备密钥验证器(SRP)配置,以 shorthand 语法传递PasswordVerifier与Salt两个字段。 |
如果只关心命令的骨架,最小化调用只需要两个必填参数:
aws cognito-idp confirm-device \ --access-token eyJra456defEXAMPLE \ --device-key us-west-2_a1b2c3d4-5678-90ab-cdef-EXAMPLE11111命令执行成功后的输出为:
{ "UserConfirmationNecessary": false }参数深入:SRP 设备密钥验证器
--device-secret-verifier-config对应服务模型中的DeviceSecretVerifierConfigType结构,它是一组由你的应用在注册用户设备时生成的 Secure Remote Password(SRP)值,包含两个成员(见 service-2.json 中 DeviceSecretVerifierConfigType 定义):
PasswordVerifier:用户的设备密码验证器(password verifier),用于 SRP 认证;Salt:SRP 认证中使用的盐值。
在 AWS CLI 的 shorthand 语法下,该结构写成PasswordVerifier=...,Salt=...的键值对形式,即示例中的PasswordVerifier=TXlWZXJpZmllclN0cmluZw,Salt=TXlTUlBTYWx0。这组值的作用是让设备端在后续设备认证(Device Auth)流程中证明“我确实持有这台被记住的设备对应的密钥”,从而在可信设备上免输入 MFA 代码。
请求结构ConfirmDeviceRequest还支持一个可选的--device-name参数(DeviceNameType),用于为设备指定一个友好名称,例如MyMobilePhone,便于在用户池中识别设备来源。
响应解读:UserConfirmationNecessary 何时为 true
ConfirmDeviceResponse只有一个布尔字段UserConfirmationNecessary(见 service-2.json 中 ConfirmDeviceResponse 定义):
- 为
false时:Cognito 立即将设备置为“已记住”,并使其具备设备认证资格; - 为
true时:需要用户明确确认是否记住该设备,应用应当提示用户做出选择,再把用户的决定通过update-device-status(对应 APIUpdateDeviceStatus)提交给 Cognito。
这个字段的取值取决于用户池配置。用户池可以配置为“总是记住设备”,此时响应恒为false;也可以配置为“允许用户选择是否记住设备(opt in)”,此时响应可能为true。该选项在用户池的 Sign-in 菜单下的 Device tracking 部分进行配置。另外,当DeviceOnlyRememberedOnUserPrompt为true时,即使应用发送了ConfirmDevice请求,Cognito 也不会自动记住设备,同样需要走用户提示流程。
授权模型:不使用 IAM 凭证
从服务模型中该操作的authtype与auth声明(smithy.api#noAuth,见 service-2.json)以及文档描述可以确认:
ConfirmDevice使用当前已登录用户的 access token授权,而不是 IAM 凭证;该 access token 必须包含aws.cognito.signin.user.adminscope。因此执行此命令前,你需要先通过aws cognito-idp initiate-auth/respond-to-auth-challenge等用户池登录流程拿到用户的 access token;- Cognito 对该 API 请求不评估 IAM 策略,无法使用 IAM 凭证授权请求,也不能在 IAM 策略中授予其权限。
这一点对 CLI 使用有直接影响:aws cognito-idp confirm-device命令本身不走常规服务凭证签名体系,凭证的正确性由 access token 自身的 scope 决定,而不是你本地 AWS 配置文件中的 IAM 身份。
可能的错误
根据 service-2.json 中 ConfirmDevice 的 errors 声明,该操作可能抛出以下异常,实际排错时可对照 CLI 报错信息定位原因:
ResourceNotFoundException、InvalidParameterException、NotAuthorizedException、InvalidPasswordException、InvalidLambdaResponseException、UsernameExistsException、InvalidUserPoolConfigurationException、TooManyRequestsException、PasswordResetRequiredException、UserNotFoundException、UserNotConfirmedException、InternalErrorException、OperationNotEnabledException、DeviceKeyExistsException、ForbiddenException。
其中几类值得重点关注:
NotAuthorizedException:access token 无效、过期或缺少aws.cognito.signin.user.adminscope;DeviceKeyExistsException/ResourceNotFoundException:device key 不存在于该用户/用户池上下文中,需检查--device-key是否取自正确的设备注册流程;OperationNotEnabledException:用户池未启用设备跟踪,该操作被拒绝。
小结与延伸阅读
confirm-device是 Cognito 设备跟踪流程中的一环,典型链路为:用户登录获取 access token →associate-sign-in-with-device获取 device key → 应用侧生成 SRP 验证器 →confirm-device提交确认 →(如UserConfirmationNecessary为 true)提示用户并经update-device-status完成记忆。仓库中可进一步参考的资料:
- 官方示例原文:confirm-device.rst;
- 服务模型(操作、请求/响应结构、错误与授权声明):service-2.json;
- 官方文档对设备跟踪机制(Working with user devices in your user pool)的完整描述见Amazon Cognito Developer Guide,仓库示例文档亦以此为延伸阅读出处。
【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考