如何在Firebase Authentication中识别用户认证对应的appId
该需求完全可以实现,共有两种常用落地方案
你截图中三个环境的独立web应用对应不同appId的场景,可根据你的可信程度要求选择对应方案:
方案1:前端侧直接读取(适合非核心逻辑场景)
前端初始化Firebase实例时已经传入了对应环境的配置,可直接从实例属性读取当前使用的appId:
import { getApp } from "firebase/app"; // 获取当前初始化的Firebase应用实例 const currentFirebaseApp = getApp(); // 读取当前实例对应的appId const usedAppId = currentFirebaseApp.options.appId;
你可以直接通过usedAppId匹配判断当前是dev/stg/prod环境,也可以在用户完成登录后将该值随用户信息一并上报存储。
注意:前端读取的参数可被用户篡改,仅适合做前端展示、逻辑分支跳转等非强校验场景,涉及权限、数据隔离的核心逻辑不能直接信任前端传入的appId。
方案2:后端/安全规则侧校验(适合强可信要求场景)
如果需要不可篡改的环境标识,建议结合Firebase Auth自定义Claims实现:
- 前端完成认证后,将读取到的appId传给云函数,云函数侧先校验传入的appId是否属于你预设的三个环境合法值
- 校验通过后给当前用户的ID Token写入自定义Claims,标记对应的appId和环境标识
示例云函数代码:
const admin = require("firebase-admin"); const functions = require("firebase-functions"); // 预设三个环境的合法appId,替换为你自己的实际值 const VALID_APP_IDS = { dev: "dev环境对应的appId", stg: "stg环境对应的appId", prod: "prod环境对应的appId" }; exports.setEnvClaim = functions.https.onCall(async (data, context) => { // 校验用户是否已登录 if (!context.auth) throw new functions.https.HttpsError("unauthenticated", "用户未登录"); // 校验appId合法性 const inputAppId = data.appId; if (!Object.values(VALID_APP_IDS).includes(inputAppId)) { throw new functions.https.HttpsError("invalid-argument", "非法appId"); } // 写入自定义Claims const env = Object.keys(VALID_APP_IDS).find(key => VALID_APP_IDS[key] === inputAppId); await admin.auth().setCustomUserClaims(context.auth.uid, { appId: inputAppId, env: env }); return { success: true }; });
后续你在云函数、Firestore安全规则、Storage安全规则中都可以直接读取ID Token中的appId、env字段做可信校验,不会被篡改。
内容的提问来源于stack exchange,提问作者user8615417
相关产品推荐
相关产品推荐

