React Native Amplify V6自定义无密码认证挑战报错求助
问题:Amplify V6 React Native 无密码认证OTP验证报错 [EmptyChallengeResponse]
我之前用React Native + Amplify V5开发myApp1,基于AWS Amplify实现了手机号无密码认证。现在用React Native + Amplify V6开发myApp2,接入同一个Amplify后端。参照AWS文档修改代码后,调用confirmSignIn验证OTP时出现错误:[EmptyChallengeResponse: challengeResponse is required to confirmSignIn]。
myApp1(Amplify V5)代码
const onSignInPressed = async data => { setIsLoading(true); const username = data.username; try { const user = await Auth.signIn('+91' + username); setSession(user); setReady(true); } catch (e) { console.error(e); } finally { setIsLoading(false); } }; const onVerifyOtp = async data => { setIsLoading(true); try { const user = await Auth.sendCustomChallengeAnswer(session, data.otp); setAuthUser(user); } catch (e) { console.error(e); } finally { setIsLoading(false); } };
myApp2(Amplify V6)代码
const onSignInPressed = async () => { setIsLoading(true); try { const user = await signIn({ username: '+91' + phoneNumber, options: { authFlowType: 'CUSTOM_WITHOUT_SRP', }, }); setSession(user); setReady(true); } catch (err) { console.error(err); } finally { setIsLoading(false); } }; const onVerifyOtp = async (otp) => { setIsLoading(true); try { console.log(otp); console.log(session.nextStep.signInStep); const output = await confirmSignIn({otp}); console.log(output); setDbUser(output); } catch (err) { console.error('onVerifyOtp', err); } finally { setIsLoading(false); } };
错误日志
LOG 111111 LOG CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE ERROR onVerifyOtp [EmptyChallengeResponse: challengeResponse is required to confirmSignIn]
解决方案
Amplify V6重构了Auth API,confirmSignIn的参数格式和V5的sendCustomChallengeAnswer完全不同,你需要做以下修改:
1. 修正onVerifyOtp函数参数
V6的confirmSignIn需要传入两个核心参数:
user:signIn返回的会话对象(即你存在session里的内容)challengeResponse:用户输入的OTP验证码
修改后的代码:
const onVerifyOtp = async (otp) => { setIsLoading(true); try { console.log(otp); console.log(session.nextStep.signInStep); // 按照V6要求的格式传递参数 const output = await confirmSignIn({ user: session, challengeResponse: otp }); console.log(output); setDbUser(output); } catch (err) { console.error('onVerifyOtp', err); } finally { setIsLoading(false); } };
2. 额外检查点
- 确认
session是signIn返回的完整对象,没有被意外修改或丢失属性 - 检查Amplify V6的配置是否和后端Cognito的自定义挑战流程匹配(比如触发器、认证流设置)
报错原因
你之前只传递{otp},但V6的confirmSignIn不识别这个字段,它需要明确的challengeResponse来接收自定义挑战的答案,同时必须传入当前会话的user对象,否则会判定缺少必填参数,抛出EmptyChallengeResponse错误。
内容的提问来源于stack exchange,提问作者Koreahn
相关产品推荐
相关产品推荐

