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

如何使用await处理AWS Cognito的authenticateUser回调方法

解决AWS Amplify authenticateUser回调转Async/Await的问题

嘿,作为长期写Python突然碰Node的开发者,回调转Promise这块确实容易踩小坑,我来帮你把代码捋顺!

首先你得注意:Promise的构造函数只接受resolve和reject两个参数,你之前写的第三个challenge参数是无效的,没法直接把newPasswordRequired的回调逻辑传出去。我们需要把所有回调(包括成功、失败、新密码要求这类中间挑战)都封装在authenticateUser的配置对象里,然后通过resolve传递不同类型的结果,让调用方用async/await处理所有场景。

正确的Promise封装代码

function authenticateUserAsync(user, authDetails) {
  return new Promise((resolve, reject) => {
    user.authenticateUser(authDetails, {
      // 登录成功时,把会话信息封装成成功类型返回
      onSuccess: (session) => {
        resolve({ type: 'success', data: session });
      },
      // 登录失败直接reject错误
      onFailure: (error) => {
        reject(error);
      },
      // 遇到新密码要求的挑战时,把相关属性返回给调用方处理
      newPasswordRequired: (userAttributes, requiredAttributes) => {
        resolve({ 
          type: 'newPasswordRequired', 
          userAttributes, 
          requiredAttributes 
        });
      },
      // 如果还有其他挑战(比如MFA验证),可以在这里继续添加对应的回调处理
      mfaRequired: (challengeName, challengeParameters) => {
        resolve({ 
          type: 'mfaRequired', 
          challengeName, 
          challengeParameters 
        });
      }
    });
  });
}

用Async/Await调用的示例

async function handleLogin(user, authDetails) {
  try {
    const authResult = await authenticateUserAsync(user, authDetails);

    // 根据返回的类型处理不同场景
    switch (authResult.type) {
      case 'success':
        console.log('登录成功!会话信息:', authResult.data);
        // 这里写登录成功后的业务逻辑
        break;
      case 'newPasswordRequired':
        console.log('需要设置新密码,用户属性:', authResult.userAttributes);
        // 可以调用user.completeNewPassword()完成新密码设置,同样可以把这个方法也封装成Promise
        // 比如await completeNewPasswordAsync(user, newPassword, authResult.requiredAttributes);
        break;
      case 'mfaRequired':
        console.log('需要MFA验证,挑战信息:', authResult.challengeParameters);
        // 处理MFA验证逻辑
        break;
    }
  } catch (error) {
    console.error('登录失败:', error);
    // 处理登录错误(比如用户名密码错误、网络问题等)
  }
}

关键说明

  • 不要给Promise构造函数传第三个参数,所有回调逻辑都要放在authenticateUser的第二个配置对象里
  • 通过返回带type标识的对象,让调用方可以清晰区分不同的认证状态,方便后续处理
  • 如果还有其他Amplify认证的回调场景,都可以用同样的方式扩展,保持代码的一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:54:10