基于AWS Cognito的Flutter无密码短信OTP注册登录实现问询
实现AWS Cognito无密码短信OTP注册登录(Flutter)
一、AWS Cognito用户池配置
- 进入Cognito用户池,切换到「MFA和验证」页面:
- 在「用户验证」区域,将首选验证方式设置为「短信验证码」,确保已配置关联的短信服务(如AWS SNS)。
- 在「认证流程」中勾选
ALLOW_USER_SMS_AUTH和ALLOW_ADMIN_USER_SMS_AUTH选项,开启短信OTP登录权限。
- 进入「应用客户端」页面,找到你的Flutter应用对应客户端:
- 编辑客户端设置,关闭「生成客户端密钥」(无密码登录场景下该选项会限制流程)。
- 确认客户端的「认证流程」已包含上述开启的短信登录流程。
二、Flutter代码修改
1. 无密码注册流程
修改注册方法,移除密码参数,直接以手机号作为用户名发起注册,Cognito会自动向该手机号发送验证OTP:
Future<void> signUpWithPhoneVerification(String phoneNumber) async { try { await Amplify.Auth.signUp( username: phoneNumber, // 手机号作为用户名,需符合格式(如+8613xxxxxxxxx) options: SignUpOptions( userAttributes: <AuthUserAttributeKey, String>{ AuthUserAttributeKey.phoneNumber: phoneNumber, }, autoSignIn: const AutoSignInEnabled(), // 可选:验证OTP后自动完成登录 ), ); } on AuthException catch (e) { safePrint('注册失败: ${e.message}'); rethrow; } }
确认注册的方法保持不变,用于验证用户输入的OTP:
Future<void> confirmSignUpPhoneVerification( String phoneNumber, String otpCode, ) async { try { await Amplify.Auth.confirmSignUp( username: phoneNumber, confirmationCode: otpCode, ); } on AuthException catch (e) { safePrint('验证失败: ${e.message}'); rethrow; } }
2. 短信OTP登录流程
替换原密码登录逻辑,改为两步式OTP登录:发起登录请求触发OTP发送,再验证OTP完成登录。
步骤1:触发OTP发送
Future<void> initiateSmsOtpSignIn(String phoneNumber) async { try { final result = await Amplify.Auth.signIn( username: phoneNumber, // 仅传手机号,无需密码 ); if (result.nextStep.signInStep == AuthSignInStep.confirmSignInWithSmsMfaCode) { safePrint('OTP已发送到目标手机号'); // 此处可跳转至OTP输入页面 } else { safePrint('登录流程异常: ${result.nextStep.signInStep}'); } } on AuthException catch (e) { safePrint('发起登录请求失败: ${e.message}'); rethrow; } }
步骤2:验证OTP完成登录
Future<void> confirmSmsOtpSignIn(String otpCode) async { try { await Amplify.Auth.confirmSignIn( confirmationValue: otpCode, ); safePrint('登录成功'); } on AuthException catch (e) { safePrint('OTP验证失败: ${e.message}'); rethrow; } }
3. 登出方法保持不变
原有登出代码可直接复用:
Future<void> signOutCurrentUser() async { final result = await Amplify.Auth.signOut(); if (result is CognitoCompleteSignOut) { safePrint('Sign out completed successfully'); } else if (result is CognitoFailedSignOut) { safePrint('Error signing user out: ${result.exception.message}'); } }
三、注意事项
- 手机号必须符合Cognito格式要求,需包含国家码(如
+8613xxxxxxxxx)。 - 检查AWS IAM权限,确保Amplify应用拥有调用Cognito短信相关API的权限。
- 若出现「用户不存在」或「认证流程不允许」错误,需返回Cognito控制台核对用户池及应用客户端的配置。
内容的提问来源于stack exchange,提问作者Hitesh Bharadwaj
相关产品推荐
相关产品推荐

