为临时密码过期用户实现Cognito托管UI自动重置密码
解决方案:自动处理Cognito过期临时密码的FORCE_CHANGE_PASSWORD用户
1. 利用Pre Authentication Lambda触发器实时处理登录尝试
这是最贴合需求的方案——在用户尝试登录时自动检测并重置过期的临时密码:
核心逻辑:用户发起登录请求时,Lambda先执行预认证检查:
- 获取用户状态与临时密码过期时间
- 若用户处于
FORCE_CHANGE_PASSWORD状态且密码已过期,调用AdminCreateUserAPI并指定MessageAction: "RESEND",重新生成临时密码并发送通知 - 放行登录流程,用户将被引导至托管UI的密码修改页面
Lambda代码示例(Node.js):
const AWS = require('aws-sdk'); const cognito = new AWS.CognitoIdentityServiceProvider(); exports.handler = async (event) => { const { userPoolId, username } = event; // 获取用户详情 const userParams = { UserPoolId: userPoolId, Username: username }; const user = await cognito.adminGetUser(userParams).promise(); // 检查用户状态及密码过期情况(此处以90天过期为例,可按需调整) const isForceChange = user.UserStatus === 'FORCE_CHANGE_PASSWORD'; const passwordExpired = user.UserAttributes.some(attr => attr.Name === 'password_last_changed' && Date.now() > new Date(attr.Value).getTime() + 90*24*60*60*1000 ); if (isForceChange && passwordExpired) { // 重新发送临时密码 const resetParams = { UserPoolId: userPoolId, Username: username, MessageAction: 'RESEND' }; await cognito.adminCreateUser(resetParams).promise(); } return event; };
- 配置注意:需为Lambda角色添加
cognito-idp:AdminGetUser和cognito-idp:AdminCreateUser权限。
2. 捕获托管UI回调错误触发重置
当用户使用过期密码登录时,托管UI会将PasswordExpiredException错误返回至SPA回调页面:
- 在SPA的回调逻辑中检测该错误类型
- 调用后端接口或直接触发Lambda执行临时密码重置
- 重置完成后,重定向用户回到Cognito托管UI发起登录
3. 批量自动化重置存量过期用户
若需处理已处于过期状态的存量用户,可设置定期批量任务:
- 通过CloudWatch Events按固定频率(如每日)触发Lambda
- Lambda扫描用户池中所有
FORCE_CHANGE_PASSWORD状态的用户,筛选出密码已过期的对象 - 批量调用
AdminCreateUser带RESEND参数完成密码重置
内容的提问来源于stack exchange,提问作者Randy Levy
相关产品推荐
相关产品推荐

