如何在AWS Cognito服务端阻止虚假用户域名(如yopmail)注册?
如何在AWS Cognito服务端阻止虚假邮箱域名注册
当然可以!客户端校验确实容易被绕过,而Cognito提供了服务端层面的可靠解决方案——Pre Sign-up Lambda Trigger,它在用户注册流程的早期触发,完全在AWS服务端执行,客户端根本没法干预。
下面是具体的实现步骤:
1. 创建Pre Sign-up Lambda函数
你需要编写一个Lambda函数,用来校验用户提交的邮箱域名是否在黑名单里。这里给你一个Node.js的示例代码:
exports.handler = async (event) => { // 定义要阻止的虚假域名列表,可以根据需求随时扩展 const blockedDomains = new Set([ 'yopmail.com', 'yopmail.net', 'temp-mail.org', 'dispostable.com' ]); // 提取用户邮箱并解析出域名部分 const email = event.request.userAttributes.email; const domain = email.split('@')[1].toLowerCase(); // 检查域名是否在黑名单中 if (blockedDomains.has(domain)) { // 抛出错误直接终止注册流程,错误信息会返回给客户端 throw new Error(`邮箱域名 ${domain} 不允许注册,请使用真实有效的邮箱地址。`); } // 校验通过,返回event对象让注册流程继续 return event; };
2. 将Lambda函数关联到你的Cognito用户池
- 登录AWS控制台,找到你的目标Cognito用户池
- 切换到触发器标签页
- 在Pre sign-up的下拉选项里,选择你刚刚创建的Lambda函数
- 点击保存配置,这样注册流程就会自动触发这个Lambda了
3. 测试验证
现在当用户尝试用黑名单里的域名注册时,Cognito会立刻触发Lambda函数校验,直接拒绝注册请求,客户端会收到你定义的错误提示,完全没法绕过这个校验。
额外优化提示
- 如果需要动态更新黑名单,不用每次改Lambda代码,可以把域名列表存在DynamoDB或者Secrets Manager里,让Lambda去读取,这样更新更灵活
- 要是需要匹配模糊域名(比如所有带yopmail的子域名),可以把判断逻辑改成正则表达式匹配,比如
/yopmail\./.test(domain) - 记得给Lambda配置合适的权限:Cognito会自动创建调用Lambda的基础权限,但如果你的Lambda需要访问DynamoDB这类服务,得手动添加对应的访问权限
内容的提问来源于stack exchange,提问作者F_SO_K




