Flutter Firebase如何实现手机号密码认证及用户Profile关联
实现方案(Flutter + Firebase 手机号+密码登录)
核心思路
Firebase Auth 没有原生的「手机号+密码」认证提供商,我们可以复用现有邮箱密码认证能力,将手机号封装为虚拟邮箱格式(比如{手机号}@你的应用专属后缀,后缀用不存在的内部域名即可,避免和真实邮箱用户冲突),即可实现无需每次登录OTP,仅注册、重置密码时验证手机号的需求。
分步实现
1. 注册流程改造
注册阶段必须先完成手机号OTP校验,确保手机号归属用户本人后再创建账号:
- 用户填写手机号、密码、个人资料(姓名、职业等)
- 发送OTP到用户手机号,验证通过后再执行账号创建逻辑
- 创建账号时将手机号拼接为虚拟邮箱,调用
createUserWithEmailAndPassword创建认证凭据 - 以认证返回的用户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校验,验证通过后再修改密码:
- 用户输入手机号,发送OTP并完成校验
- 校验通过后让用户输入新密码
- 用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
相关产品推荐
相关产品推荐

