学生开发APP:Firebase Auth达到配额时如何限制注册?
实现方案
核心思路
要同时完成Dynamic Links有效性验证和月度注册量限制,必须依赖Firebase后端服务(Cloud Functions + Firestore)做可信校验——不能只靠客户端逻辑,否则容易被篡改绕过。
步骤1:存储月度注册统计数据
用Firestore来存每月的注册计数和限制值,结构简单直观:
- 创建集合
monthlySignupStats - 每个文档ID用
YYYY-MM格式(比如2024-10),包含两个字段:count: 当月已注册用户数(初始为0)limit: 预设的注册上限(比如8000)
步骤2:编写Cloud Functions处理双重校验
写一个Callable类型的云函数,统一处理链接验证和注册量检查,确保逻辑不可篡改:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.validateSignupEligibility = functions.https.onCall(async (data, context) => { // 1. 接收客户端传入的Dynamic Link URL const dynamicLink = data.dynamicLink; if (!dynamicLink) { throw new functions.https.HttpsError("invalid-argument", "缺少动态链接参数"); } // 2. 验证Dynamic Links的有效性 try { const linkInfo = await admin.dynamicLinks().getLinkStats(dynamicLink); // 额外检查链接是否属于你的项目、是否为注册专用链接 if (!linkInfo.apps || linkInfo.apps.length === 0) { throw new functions.https.HttpsError("failed-precondition", "无效的注册链接"); } } catch (error) { throw new functions.https.HttpsError("failed-precondition", "链接验证失败:" + error.message); } // 3. 检查月度注册量是否达上限 const currentMonth = new Date().toISOString().slice(0, 7); // 生成YYYY-MM格式 const statsRef = admin.firestore().collection("monthlySignupStats").doc(currentMonth); // 用事务保证计数更新的原子性,避免并发注册导致计数错误 const result = await admin.firestore().runTransaction(async (transaction) => { const statsDoc = await transaction.get(statsRef); let count = 0; const limit = 8000; // 也可以从文档中读取预设值 if (statsDoc.exists) { count = statsDoc.data().count; } if (count >= limit) { return { eligible: false, message: "本月注册名额已满,请下月再试" }; } // 更新计数(若需避免无效预占,可后续加超时回滚逻辑) transaction.set(statsRef, { count: count + 1, limit }, { merge: true }); return { eligible: true, message: "验证通过,可继续注册" }; }); return result; });
步骤3:客户端扫码后的处理流程
用户扫描二维码后,应用拿到Dynamic Link的URL,按以下逻辑处理:
- 调用上述Callable云函数,传入动态链接URL
- 根据函数返回结果分支处理:
- 若
eligible为true:跳转到Firebase Phone Auth的验证流程(获取验证码、完成注册) - 若
eligible为false:弹出提示告知用户名额已满 - 若链接验证失败:提示用户扫描的是无效二维码
- 若
补充优化点
- 预占名额回滚:如果用户通过验证但未完成Phone Auth注册,可以加个定时云函数,清理15分钟内未完成注册的预占名额(需额外存储预占记录)
- 监控预警:用Firebase Alerts设置当
count达到7500时发送通知,提前知晓即将达上限 - 避免重复计数:也可以把计数逻辑移到Phone Auth成功后的云函数触发,替换步骤2中的预占逻辑,根据需求选择
内容的提问来源于stack exchange,提问作者Dirk
相关产品推荐
相关产品推荐

