【问题标题】:How to validate custom user information on Firebase Authentication?如何验证 Firebase 身份验证的自定义用户信息?
【发布时间】:2021-02-18 07:21:36
【问题描述】:

上下文

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

要求

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


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

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

语言:Javascript

【问题讨论】:

  • “我与“isAdmin”这样的用户保存数据” => 在哪里你保存这些数据?我是 Firestore 数据库?
  • @RenaudTarnec 也许他想使用custom claims 这将帮助他验证用户
  • @Ashish 是的,这就是我的想法,但在向他提出这种方法之前,我想了解isAdmin 属性集在哪里。这个想法是在答案中强调基于 Firestore 中的字段的解决方案与自定义声明相比的优缺点(例如:最终用户更容易修改 - 无需使用 Admin SDK-,额外的 Firestore 读取, ...)。
  • @RenaudTarnec 这是使用身份验证的一种方式
  • @RenaudTarnec 我把它放在火库里

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


【解决方案1】:

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

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

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

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


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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 2022-12-10
    • 2020-12-04
    • 2019-05-23
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2016-08-10
    相关资源
    最近更新 更多