Cognito调用forgot_password时发送重置邮件至错误地址问题排查
问题分析与解决方案
核心问题排查
确认
forgot_password的Username参数正确性
你创建用户时将Username设为了用户邮箱,调用forgot_password时传入的user_id必须确保是该用户的邮箱(或用户池配置中指定的登录凭证字段)。如果user_id是用户的sub(Cognito自动生成的唯一ID),即便能定位到用户,也要检查用户池的邮件模板是否正确引用了email属性而非其他字段。用户状态与
forgot_password的兼容性
通过admin_create_user创建用户并设置TemporaryPassword后,用户状态会变为FORCE_CHANGE_PASSWORD。Cognito的forgot_password接口主要针对ENABLED状态的用户,在强制改密码状态下调用该接口,可能触发非预期的邮件逻辑,这大概率是邮件发送异常的原因。
推荐的正确流程
根据你“管理员创建用户,用户仅收到注册通知并修改密码”的需求,推荐两种可行方案:
方案1:利用Cognito原生强制改密码流程
取消MessageAction='SUPPRESS'配置,让Cognito自动发送包含临时密码的注册通知邮件:
response = self._client.admin_create_user( UserPoolId=self._user_pool_id, Username=user.email, UserAttributes=[ { 'Name': 'email', 'Value': user.email }, { 'Name': 'custom:company_id', 'Value': user.company_id }, { 'Name': 'email_verified', 'Value': 'true' } ], TemporaryPassword=self._get_random_password(16) # 移除MessageAction,默认SEND,Cognito会自动发送带临时密码的注册邮件 )
用户收到邮件后,使用临时密码登录,Cognito会强制引导用户设置新密码,无需额外调用forgot_password。
方案2:自定义密码重置触发逻辑
如果不想让用户看到临时密码,可按以下步骤操作:
- 创建用户时保留
MessageAction='SUPPRESS',避免发送初始临时密码邮件; - 调用
admin_set_user_password设置临时密码,并指定Permanent=False,维持用户FORCE_CHANGE_PASSWORD状态; - 通过Cognito自定义消息触发器发送自定义注册通知,引导用户完成密码重置(或调用
admin_initiate_auth获取会话后触发自定义邮件)。
额外排查点
- 检查用户池邮件模板:确认重置密码模板中正确使用
{{email}}变量,而非错误的{{username}}(若username不是邮箱则会导致发送地址异常); - 核对用户池邮件配置:检查发送邮件的源地址是否正确,排除配置错误导致的邮件路由问题。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

