【问题标题】:Handling client-side authorization with Firebase使用 Firebase 处理客户端授权
【发布时间】:2018-10-02 03:31:05
【问题描述】:

我正在构建一个使用 Firebase、Firebase JavaScript SDK、Firebase 身份验证服务和实时数据库来实现持久性的客户端。

根据许多不同的来源,我的身份验证部分运行良好,但我发现授权选项有限,我认为这是一种有效的解决方案。

想要要做的是将role: 'admin' 的单个键/值附加到用户的身份验证记录中,这样我就可以通过对 Firebase 的一次基于客户端的调用来执行身份验证和授权后端。

  • 我已经阅读了有关将自定义声明附加到 Firebase 身份验证记录的信息,但我只看到有人使用 Firebase 管理库(后端)来设置令牌和解析令牌。如果可以的话,我正在尝试不通过 Firebase 函数或自定义 Express 服务器添加额外的调用。

  • 向 RTDB 添加单独的用户配置文件记录很容易,我可以将身份验证数据存储在那里。但是,这将始终需要同时调用身份验证和授权,这又一次看起来非常低效并且排除了客户端的安全脱机使用(如果 RTDB 上的角色发生变化)。

  • 进行基于客户端的身份验证调用,然后强制执行第二次基于客户端的调用以从可以实现 Firebase 管理员的 Firebase 函数(或任何其他后端服务)检索授权数据似乎效率低下图书馆。

主要问题:有没有办法使用 JavaScript 来实现从 Firebase 身份验证服务设置/检索身份验证和授权数据的目标,只需向后端发出一个请求并在客户端进行处理?

【问题讨论】:

    标签: javascript firebase firebase-authentication firebase-admin


    【解决方案1】:

    您提供的两个选项是自定义角色的惯用方法。

    • 如果您将角色作为自定义声明嵌入到用户的令牌中,您将在身份验证请求中获得它。由于这是一项提升权限的操作,因此应在受信任的环境中完成,例如您控制的服务器、Cloud Functions 或(如果不够频繁)在您的开发机器上。

    • 如果您不想这样做,并且想将其存储在数据库中,则需要一个额外的请求。该调用的开销通常不是性能问题。

    两者的结合也是可能的:手动识别初始的“系统管理员”UID,然后在您的数据库安全规则中使用它来允许授予其他用户额外的权限。但这也将具有数据库中的角色。

    与其寻找不使用这些惯用方法的理由,我建议您实施一种方法,看看您的顾虑是否在实践中浮现。

    【讨论】:

    • If you embed the role into the user's token as a custom claim, you'll get it in the authentication request -- 但是如何在客户端访问自定义声明?我没有在任何文档中看到这一点?
    • The overhead of that call is usually not a performance problem -- 我并不关心性能,而是关心 Firebase RTDB 使用成本(读取)随着时间的推移和离线使用客户端。
    • 如果您已经在使用实时数据库,那么读取role: 'admin' 的成本很低。这对我来说听起来像是过早的优化。自定义声明应该在客户端上可用,这是最近的更改。见firebase.google.com/docs/auth/admin/…
    • 感谢您的回答。让我提供更多背景信息,因为您假设我正在从头开始构建一个新应用程序,但事实并非如此。我正在尝试迁移一个现有的应用程序,并且出于合理的成本问题提出了这个问题。
    • "role": "admin" 在 JSON 中的大小为 15 个字符。以$1/GB 的成本从数据库中读取该数据,每位用户的成本降至 0.000000015 美元,或者每 1 美元的用户数超过 6600 万美元。如果这不适合您的用例,您可以将数据作为自定义声明存储在令牌中,其中不收取带宽费用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2017-04-15
    相关资源
    最近更新 更多