如何在 Firebase 身份验证上验证自定义用户信息?

时间:2021-02-18 07:21:36

标签: javascript firebase google-cloud-firestore firebase-authentication

背景

我正在使用 Firebase 电话身份验证。我有一个供用户使用的移动应用程序和一个供管理员使用的网络应用程序。 两个用户都存储在一个集合中。

要求

现在我想在用户尝试登录 Web 应用程序时验证该用户是管理员。 我将数据与“isAdmin”这样的用户保存在一起......


users:[
 {
   name:'John Doe', 
   phoneNumber:'+911234567890', 
   isAdmin:true
 } ]

现在我想验证用户是管理员的每个 Web 身份验证。否则我想拒绝身份验证,

语言:Javascript

1 个答案:

答案 0 :(得分:3)

由于用户的角色存储在 Firestore 集合中的用户文档中(如果我理解正确,名为 users),当用户登录时(因此您有用户的 uid 和电话号码),您应该查询 users Firestore 集合以获取他/她的角色(isAdmin true 或 false)。

然后根据角色,您可以显示Admin应用程序的内容或显示错误并注销用户(您不能“拒绝身份验证”,但您可以在用户签名后注销用户-in).

然而,最重要的是使用一些基于角色的安全规则来保护您的数据库(以及其他 Firebase 后端服务,如果您使用它们)。如果您的后端受到保护,则非成功打开或反向工程管理前端应用程序的授权用户可能会看到 GUI 元素,但无法读取和修改相应的数据。

由于您将角色存储在 Firestore 文档中,因此您需要在安全规则中使用 get() 函数来获取用户文档的内容。请参阅 doc 中的示例。


话虽如此,设置基于角色的访问权限策略的另一种经典方法是使用 Custom Claims,正如@Ashish 在他的回答中所解释的那样。

使用自定义声明的一个主要优点是角色(声明)包含在 ID 令牌中,因此无需额外查找 Firestore 文档来检查管理员权限。

您应该注意,您只能使用 Firebase Admin SDK 从特权服务器环境中设置自定义声明。这意味着通过您拥有的服务器或通过云功能(例如,请参阅此 article)。您也可以使用新的专用 "experimental" extension

像您一样通过 Firebase 文档设置角色更容易(只需编写或更新文档),但您需要正确保护集合,以避免恶意用户可以修改用户文档.

自定义声明的另一个优点是它们可以用于所有服务的安全规则(Firestore、Cloud Storage、RTDB)。通过 Firestore 文档进行角色声明时,您应该注意您无法在 Cloud Storage 或 RTDB 安全规则中获得此角色(您无法从其他服务的安全规则中读取 Firestore)。