Ruby后端调用Cognito admin_initiate_auth报错:UserNotFoundException
解决Cognito中使用
admin_initiate_auth时的UserNotFoundException问题 嘿,我一眼就看出问题啦——你现在用的admin_initiate_auth搭配ADMIN_NO_SRP_AUTH是用来认证已存在用户的方法,根本不是创建新用户的工具!所以当目标用户还没在Cognito用户池里时,自然会抛出UserNotFoundException这个错误。
要实现“创建用户+认证”的完整流程,得分成几步走:
第一步:先创建Cognito用户
你需要用admin_create_user方法先把用户添加到用户池中,代码示例如下:
client = Aws::CognitoIdentityProvider::Client.new # 创建新用户 create_response = client.admin_create_user({ user_pool_id: ENV['AWS_COGNITO_POOL_ID'], username: @user.email, temporary_password: '123456789', # 生成临时密码,默认要求用户首次登录修改 message_action: 'SUPPRESS' # 可选:如果不想让Cognito自动发送注册通知邮件,加上这个参数 })
第二步(可选):设置永久密码(跳过临时密码环节)
如果不想让用户用临时密码登录后修改密码,你可以在创建用户后直接设置永久密码:
# 给刚创建的用户设置永久密码 client.admin_set_user_password({ user_pool_id: ENV['AWS_COGNITO_POOL_ID'], username: @user.email, password: '123456789', permanent: true # 标记为永久密码,用户无需修改即可登录 })
第三步:执行用户认证
现在用户已经存在于用户池中了,再运行你原来的admin_initiate_auth代码就不会报错啦:
response = client.admin_initiate_auth({ auth_flow: 'ADMIN_NO_SRP_AUTH', auth_parameters: { 'USERNAME': @user.email, 'PASSWORD': '123456789' }, client_id: ENV['AWS_COGNITO_CLIENT_ID'], user_pool_id: ENV['AWS_COGNITO_POOL_ID'] })
额外注意事项
- 确保你的IAM角色拥有以下权限:
cognito-idp:AdminCreateUser、cognito-idp:AdminSetUserPassword、cognito-idp:AdminInitiateAuth,否则会遇到权限错误 - 如果你的用户池开启了
AllowAdminCreateUserOnly选项,那么所有用户都只能通过这种后台创建的方式添加,不能让用户自行注册 - 临时密码默认有有效期,且要求用户首次登录时必须修改,如果你不需要这个逻辑,一定要用
admin_set_user_password设置永久密码
内容的提问来源于stack exchange,提问作者jphorta
相关产品推荐
相关产品推荐

