如何使用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
相关产品推荐
相关产品推荐

