在 firebase 中区分普通用户和管理员的最佳方法是什么?

What would be the best way to differentiate between regular users and administrators in firebase?

我有两个独立的 React 应用程序,一个是用户的前端,另一个是带有一些自定义 CRM 系统的管理面板。我们使用 firebase 进行注册和身份验证,并在 Nodejs 后端授权用户。问题是我不确定如何将管理员与普通用户区分开来。我知道我可以在 firebase 中添加自定义声明,但这意味着当用户在管理面板上注册时,他将能够在前端登录,反之亦然,本质上是创建一个共享帐户?

我考虑过创建一个新的 firebase 项目来验证管理员身份,但这似乎是一个混乱的解决方案,因为我们想要使用将从管理面板和前端访问的 firebase 存储,并且它可能是很难写权限。另一种选择是在后端生成随机电子邮件,并在用户注册管理员时将它们保存到 firebase,但这似乎也是一个坏主意。

之前我们使用自定义身份验证解决方案,基本上将用户和管理员分别存储在数据库中。

TLDR

如何分离用户和管理员帐户,最好不要创建新项目,因为我想使用将由管理面板和用户应用程序使用的 firebase 存储?

如果是同一个 firebase 项目,则不能阻止用户登录任何一个站点,并且除非您单独使用 Firebase 提供的资源,否则不能在两个不同的项目之间共享资源。

选项 1:

您仍然需要依靠自定义声明或将用户角色存储在数据库中来区分。关于 UI,是的,用户将能够登录管理仪表板。但是,如果他们没有管理员自定义声明,您应该只重定向他们。 在后端,确保仅在验证声明后才提供数据,否则 return 一个 401 错误。

此外,为了确保不要使用 UID 作为标识符。您应该始终将 firebase IdToken 传递到您的服务器,然后使用 verifyIdToken 方法对其进行验证。

// idToken comes from the client app
admin.auth().verifyIdToken(idToken).then((decodedToken) => {
    const uid = decodedToken.uid;
    if (!decodedToken.admin) return res.sendStatus(401)
  }).catch((error) => {
    // Handle error
  });

如果你使用 Firebase Auth SDK 就是这种情况。

我会花一些时间从我自己的服务器本身提供管理仪表板。因此,当有人尝试登录 admin.domain.tld/login 时,我会检查使用该电子邮件的用户是否是管理员。如果是,则继续,否则不要。 E-Mail Link Authentication 在这里工作得很好,因为用户不需要输入密码,登录名 link(来自您服务器上的 Admin SDK)将仅发送登录名 link其他管理员 return 一个错误。

选项 #2:使用单独的 Firebase 项目:

您可以使用单独的 Firebase 项目对管理员进行身份验证,并使用 Firebase Cloud Functions to fetch data from the primary project. This will involve initializing multiple admin SDK instances 以便云功能可以访问这两个项目以对来自主项目的 admin/access 资源进行身份验证。

无论哪种方式,您都必须 运行 安全环境中的某些东西,例如 Cloud Functions 或您自己的服务器。仅客户端 SDK 是不够的。

PS:即使您为管理员创建了一个单独的项目,其他人仍然可以使用您的 Firebase 项目的配置来创建帐户。因此,请确保在这种情况下也核实海关申报:)