You need to enable JavaScript to run this app. Flutter Firebase如何实现手机号密码认证及用户Profile关联
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Firebase如何实现手机号密码认证及用户Profile关联

实现方案(Flutter + Firebase 手机号+密码登录)

核心思路

Firebase Auth 没有原生的「手机号+密码」认证提供商,我们可以复用现有邮箱密码认证能力,将手机号封装为虚拟邮箱格式(比如{手机号}@你的应用专属后缀,后缀用不存在的内部域名即可,避免和真实邮箱用户冲突),即可实现无需每次登录OTP,仅注册、重置密码时验证手机号的需求。

分步实现

1. 注册流程改造

注册阶段必须先完成手机号OTP校验,确保手机号归属用户本人后再创建账号:

  1. 用户填写手机号、密码、个人资料(姓名、职业等)
  2. 发送OTP到用户手机号,验证通过后再执行账号创建逻辑
  3. 创建账号时将手机号拼接为虚拟邮箱,调用createUserWithEmailAndPassword创建认证凭据
  4. 以认证返回的用户UID为文档ID,将用户Profile存入Firestore的users集合
    注册代码示例:
CustomMaterialButton(
  onPressed: () async {
    try {
      // 前置步骤:已完成手机号OTP验证,拿到用户输入的手机号、密码、个人资料
      // 拼接虚拟邮箱,后缀用你应用专属的内部标识即可
      String dummyEmail = "${_user.phoneNumber}@myapp.internal";
      final UserCredential _newUserCredential =
          await _firebaseAuth.createUserWithEmailAndPassword(
            email: dummyEmail, 
            password: _user.password
          );
      if (_newUserCredential != null) {
        // 给Auth用户更新手机号字段,方便后续重置密码校验
        await _newUserCredential.user?.updatePhoneNumber(verifiedPhoneCredential);
        // 关联Firestore用户Profile
        await FirebaseFirestore.instance
            .collection("users")
            .doc(_newUserCredential.user!.uid)
            .set({
              "phoneNumber": _user.phoneNumber,
              "name": _user.name,
              "occupation": _user.occupation,
              "email": _user.email,
              // 其他Profile字段
            });
        Navigator.pushNamed(context, HomeScreen.screenId);
      }
    } catch (e) {
      showCustomSnackBar(context, e.toString());
    }
  },
  text: "完成注册"),

2. 登录流程改造

登录阶段完全不需要OTP,用户输入手机号和密码后,拼接为虚拟邮箱直接调用登录接口即可:
登录代码示例:

CustomMaterialButton(
  onPressed: () async {
    try {
      // 拼接和注册规则一致的虚拟邮箱
      String dummyEmail = "${_inputPhoneNumber}@myapp.internal";
      final UserCredential _userCredential =
          await _firebaseAuth.signInWithEmailAndPassword(
            email: dummyEmail, 
            password: _inputPassword
          );
      if (_userCredential != null) {
        // 登录成功后可直接通过UID读取Firestore的用户Profile
        DocumentSnapshot userProfile = await FirebaseFirestore.instance
            .collection("users")
            .doc(_userCredential.user!.uid)
            .get();
        Navigator.pushNamed(context, HomeScreen.screenId);
      }
    } catch (e) {
      showCustomSnackBar(context, e.toString());
    }
  },
  text: "登录"),

3. 重置密码流程

重置密码阶段同样需要先做手机号OTP校验,验证通过后再修改密码:

  1. 用户输入手机号,发送OTP并完成校验
  2. 校验通过后让用户输入新密码
  3. 用OTP校验拿到的PhoneAuthCredential登录,之后调用updatePassword更新密码即可

注意事项

  • 虚拟邮箱后缀请使用不会被真实用户注册的内部标识,比如@你的应用名.internal,避免和真实邮箱登录的用户账号冲突
  • 可以在Firebase Auth控制台关闭「邮箱验证」要求,因为我们使用的是虚拟邮箱,无需验证
  • 请配置Firestore安全规则,限制用户仅能访问自己的Profile文档,规则参考:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid} {
      allow read, write: if request.auth != null && request.auth.uid == uid;
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 19:54:01