如何创建仅以用户名登录的AWS Cognito用户池?规避必填邮箱/电话要求
AWS Cognito 绕过邮箱/手机号必填限制的办法
2024年11月AWS Cognito更新后,默认要求用户池至少配置一个验证联系属性(邮箱或手机号),但你还是能继续只用用户名登录,以下是具体方案:
1. 用预注册Lambda触发器自动填虚拟值
- 新建一个预注册(Pre Sign-up)Lambda触发器,用户注册时自动给邮箱/手机号填充虚拟值(比如
no-reply@yourapp.com或+00000000000),就能绕开必填校验。 - 示例Node.js代码:
exports.handler = async (event) => { // 自动补全虚拟邮箱,跳过必填要求 if (!event.request.userAttributes.email) { event.request.userAttributes.email = 'no-reply@yourapp.com'; event.request.userAttributes.email_verified = 'true'; // 标记已验证,省去后续验证步骤 } return event; };
- 注意:需在用户池属性配置中将邮箱/手机号设为必填,依赖Lambda自动填充后,前端无需收集这些信息。
2. 调整用户池登录配置
- 进入AWS Cognito控制台,打开目标用户池的「登录体验」配置:
- 选择「仅用户名」作为登录选项;
- 在「验证联系属性」部分,取消勾选「要求验证联系属性」(若该选项可见);
- 前往「属性」配置,将邮箱和手机号设为可选。部分地区的用户池可能因合规要求强制保留至少一个联系属性,此时结合Lambda方案即可。
3. 后端通过AdminCreateUser API创建用户
- 如果你的用户由后端管控创建(而非前端自助注册),直接调用
AdminCreateUserAPI即可,无需传入邮箱或手机号。 - AWS CLI示例命令:
aws cognito-idp admin-create-user \ --user-pool-id 你的用户池ID \ --username 目标用户名 \ --temporary-password TempPass123!
- 这种方式不受前端注册表单的必填限制,适合后台统一管理用户的场景。
若部分区域用户池因合规要求强制保留联系属性,Lambda填充虚拟值是最可靠的方案,注意确保虚拟值不会与真实用户信息冲突。
内容的提问来源于stack exchange,提问作者Pasindu Chinthana
相关产品推荐
相关产品推荐

