Unity集成Firebase邮箱认证优化:求替代15秒未验证账号删除方案
可行解决方案(适合大学项目)
方案1:延迟创建认证用户,先存临时信息
- 用户提交注册信息(邮箱、密码)时,不直接创建Firebase Auth用户,而是把信息暂存到Realtime Database的临时节点(比如
/temp-users/{唯一ID}),同时生成一个唯一验证token绑定到该临时用户。 - 给用户发送验证邮件,邮件链接包含这个token。
- 用户点击链接验证后,前端通过token找到临时节点的信息,调用Firebase Auth的
CreateUserWithEmailAndPassword创建正式用户,再把用户信息写入正式DB节点,最后删除临时节点的数据。 - 优点:未验证的用户完全不会进入Auth系统,避免垃圾数据;逻辑简单,不需要复杂工具。
- 注意:临时存储的密码可以用Unity自带的Base64加密实现,或者因项目规模小暂时明文存储(不推荐但可接受)。
方案2:标记未验证用户+定时批量清理
- 用户注册时正常创建Auth用户,同时调用
SetCustomUserClaims给用户添加自定义声明{"isVerified": false}。 - 用户验证邮箱后,更新该声明为
{"isVerified": true},再写入Realtime DB。 - 写一段极简的Firebase云函数(Node.js入门级代码),设置定时触发(比如每天一次),查询所有
isVerified: false且创建时间超过24小时的用户,批量删除。 - 优点:逻辑直观,云函数代码量极少,适合大学项目快速搭建;给用户充足的验证时间(比15秒合理)。
- 示例云函数代码:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.cleanUnverifiedUsers = functions.pubsub.schedule("every 24 hours").onRun(async (context) => { const cutoffTime = Date.now() - 24 * 60 * 60 * 1000; // 24小时前的时间戳 const users = await admin.auth().listUsers(); const deletePromises = users.users .filter(user => !user.emailVerified && user.metadata.creationTime < cutoffTime) .map(user => admin.auth().deleteUser(user.uid)); await Promise.all(deletePromises); console.log(`Deleted ${deletePromises.length} unverified users`); });
方案3:限制未验证用户权限+手动定期清理
- 用户注册时正常创建Auth用户,但通过Realtime Database的安全规则,完全限制未验证邮箱用户的访问:
{ "rules": { ".read": "auth != null && auth.token.email_verified == true", ".write": "auth != null && auth.token.email_verified == true" } }
- 这样未验证的用户即使存在于Auth系统,也无法访问任何DB资源,相当于无效用户。
- 每隔几天登录Firebase控制台,进入「Authentication」页面,筛选「未验证邮箱」的用户,批量删除即可。
- 优点:几乎不需要写代码,完全依赖Firebase自带功能;适合用户量小的大学项目,手动清理成本极低。
内容的提问来源于stack exchange,提问作者Joud
相关产品推荐
相关产品推荐

