You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cognito调用forgot_password时发送重置邮件至错误地址问题排查

问题分析与解决方案

核心问题排查

  1. 确认forgot_password的Username参数正确性
    你创建用户时将Username设为了用户邮箱,调用forgot_password时传入的user_id必须确保是该用户的邮箱(或用户池配置中指定的登录凭证字段)。如果user_id是用户的sub(Cognito自动生成的唯一ID),即便能定位到用户,也要检查用户池的邮件模板是否正确引用了email属性而非其他字段。

  2. 用户状态与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:自定义密码重置触发逻辑

如果不想让用户看到临时密码,可按以下步骤操作:

  1. 创建用户时保留MessageAction='SUPPRESS',避免发送初始临时密码邮件;
  2. 调用admin_set_user_password设置临时密码,并指定Permanent=False,维持用户FORCE_CHANGE_PASSWORD状态;
  3. 通过Cognito自定义消息触发器发送自定义注册通知,引导用户完成密码重置(或调用admin_initiate_auth获取会话后触发自定义邮件)。

额外排查点

  • 检查用户池邮件模板:确认重置密码模板中正确使用{{email}}变量,而非错误的{{username}}(若username不是邮箱则会导致发送地址异常);
  • 核对用户池邮件配置:检查发送邮件的源地址是否正确,排除配置错误导致的邮件路由问题。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:41:11