You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何阻止他人通过控制台创建Firebase账户?需保留邮箱/密码认证

如何限制Firebase邮箱/密码认证的用户创建

你提到的前端限制+代码混淆的方案确实不安全——攻击者完全可以绕过前端逻辑,直接通过Firebase的公开API调用createUserWithEmailAndPassword(),代码混淆根本拦不住。要真正限制用户创建,必须在后端层面(Firebase的服务端)做控制,这里有几个靠谱的方案:

1. 限制注册邮箱的域名(最简单的快速方案)

如果你的应用只允许特定域名的用户注册(比如公司内部邮箱),可以直接在Firebase控制台配置:

  • 进入Firebase控制台 → 你的项目 → AuthenticationSign-in method
  • 找到Email/Password认证,点击右侧的齿轮图标进入设置
  • Authorized domains下方的Restrict sign-in to verified domains里添加允许的邮箱域名(比如yourcompany.com
    这样只有该域名的邮箱才能完成注册,不需要写任何代码。

2. 使用Firebase Cloud Functions的Auth触发器拦截注册

如果需要更复杂的验证逻辑(比如需要邀请码、用户白名单),可以用Cloud Functions的beforeCreate触发器,在用户账户被创建前进行校验:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.blockUnauthorizedSignups = functions.auth.user().beforeCreate(async (user, context) => {
  // 这里写你的验证逻辑,比如检查邮箱是否在白名单里,或者是否提供了有效的邀请码
  const allowedEmails = ["user1@example.com", "user2@example.com"]; // 示例白名单
  if (!allowedEmails.includes(user.email)) {
    throw new functions.auth.HttpsError(
      "permission-denied",
      "你没有注册权限"
    );
  }

  // 如果需要验证邀请码,可以从context.auth.token里获取前端传递的自定义参数
  // 或者从Firestore数据库查询邀请码是否有效
});

部署这个云函数后,任何不符合条件的注册请求都会被直接拒绝,完全无法创建账户。

3. 自定义注册流程(完全控制注册逻辑)

彻底不让客户端直接调用createUserWithEmailAndPassword(),而是让用户先提交注册信息到你的Cloud Function,在函数里完成所有验证后,再用Firebase Admin SDK创建用户:

// 客户端代码(只提交注册请求到云函数)
async function register(email, password, inviteCode) {
  try {
    const response = await fetch("/create-user", {
      method: "POST",
      body: JSON.stringify({ email, password, inviteCode })
    });
    const data = await response.json();
    // 注册成功后再让用户登录
    await firebase.auth().signInWithEmailAndPassword(email, password);
  } catch (error) {
    console.error("注册失败:", error);
  }
}

// 云函数代码(处理注册请求)
exports.createUser = functions.https.onCall(async (data, context) => {
  const { email, password, inviteCode } = data;

  // 验证邀请码是否有效(比如从Firestore查询)
  const inviteDoc = await admin.firestore().collection("invites").doc(inviteCode).get();
  if (!inviteDoc.exists || inviteDoc.data().used) {
    throw new functions.https.HttpsError("invalid-argument", "无效的邀请码");
  }

  // 验证通过,创建用户
  const userRecord = await admin.auth().createUser({
    email: email,
    password: password
  });

  // 标记邀请码为已使用
  await inviteDoc.ref.update({ used: true });

  return { uid: userRecord.uid };
});

这种方式完全掌控了注册流程,客户端无法绕过验证直接创建用户。

为什么你的临时方案不安全?

  • 前端的限制逻辑可以被轻易绕过:攻击者可以直接用Postman或者curl调用Firebase Auth的createUserWithEmailAndPassword API,只要知道你的项目API密钥和项目ID(这些信息在前端代码里很容易获取)。
  • 代码混淆只能增加一点逆向难度,但无法阻止有经验的攻击者,API的调用方式是公开的,混淆代码不影响API调用。

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

火山引擎 最新活动