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
相关产品推荐
相关产品推荐

