React调用Cognito发送找回密码验证码报NotAuthorizedException
问题根因
NotAuthorizedException: Contact administrator to reset password报错与你配置的cognito-idp:AdminResetUserPasswordIAM权限无关联。
你前端代码调用的cognitoUser.forgotPassword()是Cognito面向普通用户的自助密码重置接口,走用户自主找回密码流程;而cognito-idp:AdminResetUserPassword是服务端调用的管理员级强制重置接口,二者适用场景、权限校验逻辑完全不匹配,给应用角色加这个权限对自助重置流程没有任何作用。
该报错的直接原因是当前Cognito用户池配置禁用了用户自助重置密码功能,密码重置权限被限定为仅管理员可操作。
修复方案
- 登录AWS控制台进入Cognito服务页,选中项目绑定的目标用户池
- 旧版控制台进入「策略 > 密码策略」页,新版控制台进入「登录体验 > 管理登录方式」页,找到用户账户恢复配置块
- 勾选「允许用户自行重置密码」选项,取消「仅管理员可重置密码」的选中状态,保存配置
- 同步检查用户池消息配置:确认已正确绑定发信邮箱/SES服务,保证重置验证码可以正常投递到用户邮箱
- 移除当前应用角色上配置的
cognito-idp:AdminResetUserPassword权限,该权限属于管理员级高危权限,配置在前端可访问的角色上存在越权操作所有用户账号的安全风险,自助重置流程完全不需要该权限。
特殊场景适配
如果你的业务逻辑要求必须由管理员统一重置密码(比如内部管理系统),则不能在前端直接调用forgotPassword方法:
- 不要把管理员权限凭证暴露在前端代码中
- 在Amplify后端(比如Lambda函数)中编写管理员重置接口,给该函数的执行角色配置
cognito-idp:AdminResetUserPassword权限 - 前端仅将用户邮箱参数传给自建的后端接口,由后端完成重置验证码的下发逻辑。
你贴出的前端自助重置代码逻辑本身没有问题,完成上述用户池配置调整后即可正常运行。
内容的提问来源于stack exchange,提问作者Rodrigo Ferreira
相关产品推荐
相关产品推荐

