Flutter Firebase中如何通过自有邮箱发送OTP完成邮箱验证
Flutter+Firebase 自定义邮箱OTP验证实现方案
核心思路
绕过Firebase默认的邮件验证链路,自行实现OTP的生成、存储、发送、校验全流程,校验通过后通过Firebase Admin SDK手动同步用户的邮箱验证状态即可。
具体实现步骤
1. 引入依赖
在pubspec.yaml中添加必要依赖:
生产环境推荐额外自备后端服务处理邮件发送逻辑,避免发件邮箱密钥泄露。测试阶段可使用dependencies: flutter: sdk: flutter firebase_core: ^2.24.2 # 替换为当前最新稳定版 firebase_auth: ^4.15.1 # 替换为当前最新稳定版 cloud_firestore: ^4.13.6 # 替换为当前最新稳定版,用于存储OTP及过期信息flutter_email_sender等前端邮件发送插件快速验证流程。2. OTP生成与存储
用户提交注册邮箱后,生成6位随机数字作为OTP,同时设置5-15分钟的有效时长,将OTP、过期时间戳、用户邮箱、用户UID绑定存储到Cloud Firestore中,参考存储结构:用户集合users/{用户UID}: email: "xxx@example.com" otp: "123456" otp_expire_at: 1700000000000 # 毫秒级时间戳 is_verified: false3. 自定义邮箱发送OTP
- 生产方案(推荐):前端将用户邮箱、生成的OTP传给自有后端,后端使用你指定的发件邮箱调用邮件服务接口发送自定义内容的OTP邮件,全程不暴露发件箱敏感配置
- 测试方案:前端集成邮件发送插件,配置发件箱SMTP信息直接发送,该方案仅可用于本地测试,禁止上线使用
4. OTP校验与状态同步
用户输入OTP后,先拉取Firestore中对应用户的存储数据做两层校验:- 校验当前时间是否超过
otp_expire_at,超时则提示OTP已过期,需重新发送 - 校验用户输入的OTP与存储的OTP是否一致
两层校验均通过后,更新Firestore中用户的is_verified字段为true,再通过Firebase Admin SDK(可通过云函数/自有后端调用)更新Firebase Auth中用户的emailVerified状态为true,云函数核心代码参考(Node.js):
注意:Firebase客户端SDK无权限直接修改const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.syncEmailVerifyStatus = functions.firestore .document('users/{uid}') .onUpdate(async (change, context) => { const newData = change.after.data(); if (newData.is_verified === true) { await admin.auth().updateUser(context.params.uid, { emailVerified: true }); } });emailVerified字段,必须通过Admin SDK完成状态同步。- 校验当前时间是否超过
5. 登录态校验
后续用户登录时,先读取FirebaseAuth.instance.currentUser?.emailVerified字段,状态为false则直接跳转至OTP验证页面,完成验证前禁止使用核心功能。
注意事项
生产环境必须将OTP生成、邮件发送、校验逻辑部署在后端/云函数侧,禁止在前端处理敏感逻辑,避免被恶意刷取邮件、暴力破解OTP。OTP有效期建议设置为5分钟,单用户发送OTP的频率要做限流。
内容的提问来源于stack exchange,提问作者FTF Studio
相关产品推荐
相关产品推荐

