在firebase中区分普通用户和管理员的最佳方法是啥? [复制]

Posted

技术标签:

【中文标题】在firebase中区分普通用户和管理员的最佳方法是啥? [复制]【英文标题】:What would be the best way to differentiate between regular users and administrators in firebase? [duplicate]在firebase中区分普通用户和管理员的最佳方法是什么? [复制] 【发布时间】:2021-08-10 15:52:32 【问题描述】:

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

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

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

TLDR

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

【问题讨论】:

【参考方案1】:

您不能阻止用户登录同一个 firebase 项目的任何一个网站,也不能在两个不同的项目之间共享资源,除非您只使用 Firebase 提供的功能。

选项 1:

您仍然需要依靠自定义声明或将用户的角色存储在数据库中来区分。关于 UI,是的,用户将能够在管理仪表板上登录。但是,如果他们没有管理员自定义声明,您应该只重定向他们。 在后端,请确保仅在验证声明后才提供数据,否则会返回 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 在这里完美运行,因为用户无需输入密码,登录链接(来自服务器上的 Admin SDK)只会将登录链接发送给管理员,否则会返回错误。

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

您可以使用单独的 Firebase 项目来验证管理员身份,并使用 Firebase Cloud Functions 从主项目中获取数据。这将涉及初始化multiple admin SDK instances,以便云功能可以访问这两个项目以验证主项目的管理员/访问资源。

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

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

【讨论】:

以上是关于在firebase中区分普通用户和管理员的最佳方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在同一个 AD 用户帐户下运行的不同应用程序池 - 如何在任务管理器中区分?

如何在 Web 应用程序中区分用户

在firebase中保存svg的最佳方法是啥?

如何从任务管理器进程列表中的进程列表中区分不同的JavaWS应用程序?

如何在 JavaScript 中区分 iPhone、iPad 和 iPod?

在 Firebase 中管理聊天频道的最佳方式