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

Flutter应用:手机号认证前如何访问Firestore数据?

Flutter实现指定手机号注册:认证前校验Firestore数据

核心思路

先通过Cloud Firestore校验用户输入的手机号是否在允许注册的列表中,只有校验通过后,再触发Firebase Auth的手机号认证流程。

具体步骤

1. 配置依赖

确保pubspec.yaml中引入必要的Firebase包:

dependencies:
  flutter:
    sdk: flutter
  firebase_auth: ^latest_version
  cloud_firestore: ^latest_version

执行flutter pub get安装依赖。

2. 实现手机号预校验函数

写一个异步函数,查询Firestore中存储允许注册手机号的集合(比如命名为allowed_phones),判断当前输入的手机号是否存在:

import 'package:cloud_firestore/cloud_firestore.dart';

Future<bool> isPhoneAllowed(String phoneNumber) async {
  // 统一手机号格式(去掉空格、统一区号,避免查询偏差)
  final formattedPhone = phoneNumber.replaceAll(RegExp(r'\s+'), '');
  
  try {
    // 查询指定手机号的文档
    final snapshot = await FirebaseFirestore.instance
        .collection('allowed_phones')
        .where('phone', isEqualTo: formattedPhone)
        .get();
    
    // 查询结果有数据则说明手机号被允许
    return snapshot.docs.isNotEmpty;
  } catch (e) {
    // 处理查询异常(网络错误、权限问题等)
    print('查询手机号权限失败: $e');
    return false;
  }
}

3. 整合校验与认证流程

在用户提交手机号的按钮点击事件中,先执行校验,再根据结果走认证流程:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

void handlePhoneSubmit(BuildContext context, String phoneNumber) async {
  // 先校验手机号是否被允许
  final isAllowed = await isPhoneAllowed(phoneNumber);
  
  if (!isAllowed) {
    // 提示用户手机号未授权
    showDialog(
      context: context,
      builder: (ctx) => AlertDialog(
        title: const Text('提示'),
        content: const Text('该手机号未被允许注册'),
        actions: [TextButton(onPressed: () => Navigator.pop(ctx), child: const Text('确定'))],
      ),
    );
    return;
  }

  // 校验通过,触发Firebase手机号认证
  await FirebaseAuth.instance.verifyPhoneNumber(
    phoneNumber: phoneNumber,
    verificationCompleted: (PhoneAuthCredential credential) async {
      await FirebaseAuth.instance.signInWithCredential(credential);
      // 认证成功后的逻辑(比如跳转首页)
    },
    verificationFailed: (FirebaseAuthException e) {
      print('认证失败: $e');
    },
    codeSent: (String verificationId, int? resendToken) {
      // 跳转到验证码输入页面,传入verificationId
    },
    codeAutoRetrievalTimeout: (String verificationId) {},
  );
}

4. 配置Firestore安全规则

为防止恶意遍历所有允许的手机号,设置安全规则限制查询:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /allowed_phones/{doc} {
      // 只允许查询指定手机号的文档,禁止全量读取
      allow read: if request.query.where('phone', '==', request.resource.data.phone);
    }
  }
}

注意事项

  • 确保Firestore中allowed_phones集合的文档包含phone字段,存储格式和前端格式化后的手机号一致;
  • 处理网络异常情况,避免用户无反馈;
  • 验证码发送后的逻辑需自行补充(比如验证码输入页面、验证逻辑)。

内容的提问来源于stack exchange,提问作者Arun SS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:50:45