Serverless部署的AWS Cognito注册接口未触发验证确认邮件发送
问题排查方案
你遇到的控制台手动创建用户发信正常、公开API注册无验证邮件的核心原因是:两套操作走Cognito完全独立的用户创建流程,邮件触发逻辑互不共享,不存在全局邮件配置生效后两边都会自动触发的机制。
具体按以下顺序定位问题:
- 检查SignUp请求的必填参数缺失
你当前的请求报文中没有携带UserAttributes字段。很多人会踩这个坑:以为把邮箱设为用户名属性(UsernameAttributes: - email),SignUp的时候把邮箱填在Username字段里,系统就会自动同步成用户属性的邮箱。实际上Cognito的公开SignUp接口根本不做这个映射,哪怕你开了邮箱自动验证,只要你没显式把邮箱写到UserAttributes里,系统就识别不到这个用户有邮箱属性,自然不会触发验证邮件。
你需要将SignUp的请求体调整为包含对应属性的结构:{ "ClientId": "你的应用客户端ID", "Username": "注册邮箱", "Password": "设置的用户密码", "UserAttributes": [ {"Name": "email", "Value": "注册邮箱"} ], "ValidationData": null } - 检查用户池客户端的权限配置
首先确认你请求里的ClientId对应的是公共客户端,也就是没有开启客户端密钥(Client Secret)的类型——SignUp是面向终端用户的公开接口,不支持带密钥的机密客户端。
其次在serverless.yml中,和你定义的CognitoUserPool绑定的UserPoolClient资源,需要在ExplicitAuthFlows字段中配置允许公开注册的认证流程,示例配置:
如果缺少ExplicitAuthFlows: - ALLOW_USER_SRP_AUTH - ALLOW_USER_PASSWORD_AUTH - ALLOW_REFRESH_TOKEN_AUTH - ALLOW_CUSTOM_AUTHALLOW_USER_PASSWORD_AUTH权限,即使接口能成功创建用户,也可能跳过属性验证的邮件触发逻辑。 - 排查是否存在自动跳过验证的触发器配置
如果你给用户池绑定了PreSignUp类型的Lambda触发器,需要检查触发器代码中是否存在将autoConfirmUser设为true的逻辑。这类配置会让用户创建后直接进入CONFIRMED状态,系统自然不会发送验证邮件。
你可以在Cognito控制台对应用户池的用户列表中,找到通过API注册的测试用户,核对用户状态:若状态为
CONFIRMED,说明用户被自动完成验证,流程已经走到了已激活阶段,不存在发信环节;若状态为UNCONFIRMED,则为请求参数缺失导致的邮件未触发。 - 核对独立的邮件发送规则配置
Cognito中两类场景的邮件发送开关是完全独立的:控制台手动创建用户触发的是「管理员创建用户邀请」类的邮件规则,公开注册触发的是「新用户注册验证」类的独立邮件规则。你需要在用户池的消息自定义模块中,确认没有把「新用户注册验证」类的邮件设置为不发送。
内容的提问来源于stack exchange,提问作者Michał Miler
相关产品推荐
相关产品推荐

