AWS Cognito托管UI下邮箱注册登录大小写不敏感方案问询
解决AWS Cognito托管UI下邮箱大小写不敏感的问题
嘿,我刚好碰到过一模一样的场景,你用Cognito托管UI没法改前端的话,只需要调整Lambda触发器的逻辑,覆盖注册和登录两个阶段就能搞定这个大小写敏感的问题。你之前的PreSignUp思路是对的,但漏了关键的修改点,我给你捋清楚:
问题出在哪?
你之前的Lambda只修改了event.request.userAttributes.email,但Cognito里用户名(也就是你用的邮箱)是存在event.userName字段里的,这个才是Cognito识别用户的核心标识。你改了邮箱属性但没改用户名,用户池里还是存着原始大小写的邮箱作为用户名,自然登录时会出现大小写不匹配的情况。
步骤1:修改PreSignUp Lambda,强制存储小写的用户名和邮箱
更新你的PreSignUp触发器函数,同时把userName和email都转成小写,还要重置邮箱验证状态(避免验证邮件发去原始邮箱):
'use strict'; console.log('Loading PreSignUp lowercase conversion function'); exports.handler = (event, context, callback) => { console.log('Received event:', JSON.stringify(event, null, 2)); // 处理邮箱和用户名(因为邮箱作为用户名)转小写 if (event.request.userAttributes.email) { const lowerEmail = event.request.userAttributes.email.toLowerCase(); // 修改请求中的邮箱属性 event.request.userAttributes.email = lowerEmail; // 关键:修改用户名(Cognito用这个识别用户) event.userName = lowerEmail; // 重置邮箱验证状态,确保验证邮件发送到转换后的小写邮箱 if (event.request.userAttributes.email_verified) { event.request.userAttributes.email_verified = 'false'; } console.log('Converted email and username to lowercase:', lowerEmail); } callback(null, event); };
步骤2:添加PreAuthentication触发器,处理登录时的大小写转换
注册时存了小写用户名,但用户登录时可能还是会输入大写邮箱,这时候要在登录前把输入的用户名转成小写,让Cognito能匹配到正确的用户。新建一个Lambda函数作为PreAuthentication触发器:
'use strict'; console.log('Loading PreAuthentication lowercase conversion function'); exports.handler = (event, context, callback) => { console.log('Received event:', JSON.stringify(event, null, 2)); // 将登录时输入的用户名(邮箱)转小写 if (event.userName) { event.userName = event.userName.toLowerCase(); console.log('Converted login username to lowercase:', event.userName); } callback(null, event); };
把触发器配置到Cognito用户池
- 打开AWS Cognito控制台,找到你的用户池
- 切换到触发器标签页
- 在PreSignUp下拉菜单里选你刚更新的第一个Lambda函数
- 在PreAuthentication下拉菜单里选第二个Lambda函数
- 保存配置就大功告成了!
这样一来,不管用户注册或登录时输入什么大小写的邮箱,都会被统一转换成小写处理,完全实现大小写不敏感,而且全程不用碰托管UI的代码。
内容的提问来源于stack exchange,提问作者F_SO_K
相关产品推荐
相关产品推荐

