You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为AWS Cognito控制台创建的用户添加自定义属性,如何正确调用Auth.CompleteNewPassword?

AWS Cognito 首次登录强制改密码时添加自定义属性解决方案

问题原因

你当前的代码错误在于:第一次用临时密码登录触发NEW_PASSWORD_REQUIRED挑战时,直接调用了Auth.completeNewPassword(),但此时用户还没输入新密码,自然会报newPassword未定义的错误——调用时机完全错了,这个方法必须等用户输入新密码后再执行。

正确实现流程

需要把整个流程拆成两步:

  1. 用户用临时密码登录,触发挑战后,前端切换到新密码输入界面
  2. 用户输入新密码并提交,此时再调用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;
  }
}

前端配合逻辑

  1. 调用handleSignIn后,如果返回NEW_PASSWORD_REQUIRED状态,渲染新密码输入表单(可包含需要的自定义属性输入项)
  2. 用户填写新密码和自定义属性后,调用handleCompleteNewPassword,传入之前拿到的user对象、新密码和自定义属性对象

注意事项

  • 自定义属性必须以custom:为前缀,比如custom:department、custom:role,且需要在Cognito用户池的属性设置中提前开启这些自定义属性
  • 如果Cognito要求填写必填属性(比如邮箱、姓名),需要在requiredAttributes中收集后一并传入completeNewPassword的第三个参数

内容的提问来源于stack exchange,提问作者soul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:27:12