本地Moto Server结合Cognito-IDP与AWSSRP认证报错求助
问题背景
搭建本地Moto Server后,通过admin_create_user和admin_set_user_password成功创建并配置了Cognito用户,非SRP方式(如admin_initiate_auth使用USER_PASSWORD_AUTH流程)可正常认证,但使用warrant库的AWSSRP进行SRP认证时,抛出UserNotFoundException错误,提示用户不存在。
问题原因
Moto对Cognito SRP认证的实现与AWS原生服务存在细节差异:AWS原生Cognito在调用admin_set_user_password时,会自动生成SRP认证所需的salt和password_verifier用户属性,但Moto并未实现这一自动生成逻辑,导致AWSSRP在执行认证流程时无法找到用户的SRP相关参数,进而触发用户不存在的错误。
解决方案
手动生成用户的SRP盐和验证密钥,并更新到用户属性中,具体步骤如下:
1. 在用户创建代码中添加SRP属性生成与更新
修改create_user.py,在admin_set_user_password之后添加以下代码,生成并设置SRP所需的用户属性:
from warrant.aws_srp import AWSSRP # 初始化AWSSRP实例以生成SRP参数 aws_srp_generator = AWSSRP( username=cognito_user_name, password=cognito_user_password, pool_id=cl_pool_id, client_id=cl_client_id, client=cognito_client ) # 生成SRP盐和验证密钥 srp_salt = aws_srp_generator.get_salt() password_verifier = aws_srp_generator.get_password_verifier() # 更新用户属性,添加SRP相关参数 update_srp_attrs = cognito_client.admin_update_user_attributes( UserPoolId=cl_pool_id, Username=cognito_user_name, UserAttributes=[ {'Name': 'salt', 'Value': srp_salt}, {'Name': 'password_verifier', 'Value': password_verifier} ] ) print(f"SRP属性更新结果:{update_srp_attrs}")
2. 确认User Pool Client的认证流程配置
确保User Pool Client的ExplicitAuthFlows包含ALLOW_USER_SRP_AUTH(你的代码中已配置,可忽略此步):
ExplicitAuthFlows=[ 'ALLOW_ADMIN_USER_PASSWORD_AUTH', 'ALLOW_USER_PASSWORD_AUTH', 'ALLOW_USER_SRP_AUTH', 'ALLOW_REFRESH_TOKEN_AUTH', ],
3. 重新执行认证流程
修改完成后,重新运行create_user.py创建用户,再执行get_token.py即可通过AWSSRP完成SRP认证,成功获取令牌。
验证说明
添加SRP属性后,Moto的Cognito服务在处理RespondToAuthChallenge请求时,就能找到用户对应的SRP参数,从而完成SRP认证流程,解决UserNotFoundException错误。
内容的提问来源于stack exchange,提问作者souzou johnny

