为AWS Cognito控制台创建的用户添加自定义属性,如何正确调用Auth.CompleteNewPassword?
AWS Cognito 首次登录强制改密码时添加自定义属性解决方案
问题原因
你当前的代码错误在于:第一次用临时密码登录触发NEW_PASSWORD_REQUIRED挑战时,直接调用了Auth.completeNewPassword(),但此时用户还没输入新密码,自然会报newPassword未定义的错误——调用时机完全错了,这个方法必须等用户输入新密码后再执行。
正确实现流程
需要把整个流程拆成两步:
- 用户用临时密码登录,触发挑战后,前端切换到新密码输入界面
- 用户输入新密码并提交,此时再调用
completeNewPassword(),同时传入自定义属性
修改后的代码示例
// 第一步:处理临时密码登录,触发挑战 async handleSignIn(formData) { const { username, password } = formData; try { const user = await Auth.signIn(username, password); // 检测到需要修改密码的挑战,返回用户对象和挑战信息给前端 if (user.challengeName === 'NEW_PASSWORD_REQUIRED') { return { status: 'NEW_PASSWORD_REQUIRED', user, requiredAttributes: user.challengeParam.requiredAttributes }; } else { // 正常登录逻辑 return { status: 'SUCCESS', user }; } } catch (e) { console.error('登录失败:', e); throw e; } } // 第二步:用户输入新密码后,完成密码修改并添加自定义属性 async handleCompleteNewPassword(user, newPassword, customAttributes) { try { // 自定义属性需要以custom:开头,比如{ 'custom:userType': 'admin' } const updatedUser = await Auth.completeNewPassword( user, newPassword, customAttributes ); console.log('密码修改完成,用户信息:', updatedUser); return updatedUser; } catch (e) { console.error('密码修改失败:', e); throw e; } }
前端配合逻辑
- 调用
handleSignIn后,如果返回NEW_PASSWORD_REQUIRED状态,渲染新密码输入表单(可包含需要的自定义属性输入项) - 用户填写新密码和自定义属性后,调用
handleCompleteNewPassword,传入之前拿到的user对象、新密码和自定义属性对象
注意事项
- 自定义属性必须以
custom:为前缀,比如custom:department、custom:role,且需要在Cognito用户池的属性设置中提前开启这些自定义属性 - 如果Cognito要求填写必填属性(比如邮箱、姓名),需要在
requiredAttributes中收集后一并传入completeNewPassword的第三个参数
内容的提问来源于stack exchange,提问作者soul
相关产品推荐
相关产品推荐

