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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:37:18