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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:37