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

React Native + AWS Amplify V6无密码认证登录报错求助

解决Amplify V6 React Native无密码手机号认证的signIn报错问题

问题原因

Amplify V6对无密码认证的API调用逻辑做了调整:V5中Auth.signIn(手机号)会自动适配无密码流程,而V6的signIn函数默认采用密码登录流程,必须明确指定认证流类型才能触发无密码的OTP验证流程,这就是你遇到密码必填报错的核心原因。

详细解决方案

1. 修正signIn调用逻辑(核心步骤)

在myApp2中,需要使用带authFlowType参数的signIn调用触发无密码认证流程(发送OTP验证码),之后再通过confirmSignIn验证验证码。

完整代码示例:

import { signIn, confirmSignIn } from 'aws-amplify/auth';
import { useState } from 'react';

// 状态管理
const [session, setSession] = useState(null);
const [ready, setReady] = useState(false);
const [otpRequired, setOtpRequired] = useState(false);
const [currentPhone, setCurrentPhone] = useState('');

// 触发手机号认证(发送OTP)
const onSignInPressed = async (phoneNumber) => {
  try {
    setCurrentPhone(phoneNumber);
    // 启动自定义无密码认证流程,触发Cognito发送SMS验证码
    const signInResult = await signIn({
      username: phoneNumber,
      authFlowType: 'CUSTOM_AUTH' // 必须指定该参数,匹配后端Cognito配置
    });

    // 检查是否需要输入OTP(无密码认证的标准流程)
    if (signInResult.nextStep.signInStep === 'CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE') {
      setOtpRequired(true);
      setSession(signInResult);
    }
  } catch (e) {
    console.error('发送验证码失败:', e.message);
  }
};

// 验证OTP验证码
const onConfirmOtpPressed = async (otpCode) => {
  try {
    const confirmResult = await confirmSignIn({
      challengeResponse: otpCode
    });
    // 认证成功,更新状态
    setSession(confirmResult);
    setReady(true);
    setOtpRequired(false);
  } catch (e) {
    console.error('验证码验证失败:', e.message);
  }
};

2. 确认Amplify配置正确性

确保myApp2的Amplify配置文件(amplifyconfiguration.json)中,认证模块的authenticationFlowType与后端Cognito用户池配置一致:

"auth": {
  "plugins": {
    "awsCognitoAuthPlugin": {
      "CognitoUserPool": {
        "Default": {
          "PoolId": "你的用户池ID",
          "AppClientId": "你的应用客户端ID",
          "Region": "你的AWS区域",
          "authenticationFlowType": "CUSTOM_AUTH"
        }
      },
      "Auth": {
        "Default": {
          "authenticationFlowType": "CUSTOM_AUTH"
        }
      }
    }
  }
}

如果是通过amplify pull获取的后端配置,该参数会自动同步;如果是手动配置,必须与后端Cognito用户池的认证流程(需启用ALLOW_CUSTOM_AUTH)匹配。

3. 理解V5与V6的差异

  • V5的Auth.signIn(phone)会自动检测用户池配置,选择合适的认证流;
  • V6的signIn函数默认使用USER_PASSWORD_AUTH流程(需要密码),必须显式指定authFlowType: 'CUSTOM_AUTH'才能触发无密码的OTP流程。

你之前的错误尝试:

  • signIn(phonenumber):V6不支持直接传入字符串参数,必须使用对象格式,因此报username is required;
  • signIn({username: phonenumber}):未指定认证流,默认走密码流程,因此要求输入密码;
  • 传入password: null或无效密码:密码流程下密码不能为空/无效,触发password is required报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:50:41