如何生成Amazon Cognito DEVICE_PASSWORD_VERIFIER的PASSWORD_CLAIM_SIGNATURE值?
- 已成功通过
DEVICE_SRP_AUTH挑战,但在处理DEVICE_PASSWORD_VERIFIER阶段时,始终收到NotAuthorizedException: Invalid username or password错误 - 使用AWS Java SDK,采用
ADMIN_USER_PASSWORD_AUTH认证流程,调用adminRespondToAuthChallenge方法发起挑战响应 - 推测问题出在
SRP_A或PASSWORD_CLAIM_SIGNATURE的生成逻辑上,相关实现代码位于DeviceHelper类中 - 已创建脱敏后的临时代码仓库,填充环境变量即可直接运行复现问题
- 用户池已配置设备追踪及对应应用设置(附设置截图:[设备追踪设置]、[应用设置])
- 已查阅亚马逊官方文档及Stack Overflow相关帖子,仍无法定位并解决问题
排查建议
- 验证SRP_A生成逻辑
- 确保SRP_A的生成严格遵循Cognito的SRP规范:使用2048位大质数N和生成元g,且SRP_A不能为0或N的倍数
- 检查Java代码中BigInteger的初始化、模运算等步骤是否正确,避免出现计算溢出或逻辑错误
- 检查PASSWORD_CLAIM_SIGNATURE生成
- 确认签名时使用的参数顺序和内容正确:必须包含
DEVICE_KEY、USERNAME、SECRET_HASH(若应用开启客户端密钥)、SRP_A、SRP_B等核心参数 - 验证HMAC算法实现:Cognito要求使用HMAC-SHA256,签名密钥需为
DEVICE_SRP_AUTH阶段获取的DEVICE_SECRET_VERIFIER_CONFIG.DEVICE_SECRET
- 确认签名时使用的参数顺序和内容正确:必须包含
- 核对挑战响应参数
- 确保
adminRespondToAuthChallenge请求中包含所有必填参数:CHALLENGE_NAME设为DEVICE_PASSWORD_VERIFIER,CHALLENGE_RESPONSES需包含USERNAME、DEVICE_KEY、SRP_A、PASSWORD_CLAIM_SIGNATURE、PASSWORD_CLAIM_SECRET_BLOCK等 - 检查参数名的大小写是否完全匹配Cognito的要求(如参数名需严格符合AWS API的规范)
- 确保
推荐工具库
- AWS Amplify Java Library:官方提供的高层封装库,已内置Cognito设备认证的完整流程,无需手动实现SRP计算和签名生成逻辑
- cognito-srp-java:第三方轻量级库,专注于Cognito SRP认证逻辑的实现,可直接复用
DEVICE_PASSWORD_VERIFIER相关的签名生成代码
内容的提问来源于stack exchange,提问作者Amy
相关产品推荐
相关产品推荐

