使用 Firebase 处理客户端授权
Handling client-side authorization with Firebase
我正在构建一个使用 Firebase、Firebase JavaScript SDK、Firebase 身份验证服务和实时数据库的客户端。
根据许多不同的来源,我的身份验证部分运行良好,但我发现授权选项有限,我认为这是一个有效的解决方案。
我想要做的是将role: 'admin'
中的单个key/value附加到用户的授权记录,这样我就可以进行身份验证和授权只有一次基于客户端的 Firebase 后端调用。
我读过有关将自定义声明附加到 Firebase 身份验证记录的信息,但我只看到人们使用 Firebase Admin 库(后端)来设置令牌和解析令牌。如果可以的话,我尽量不通过 Firebase 函数或自定义 Express 服务器添加额外的调用。
向 RTDB 添加单独的用户配置文件记录很容易,我可以将身份验证数据存储在那里。然而,这将始终需要同时调用身份验证和授权,这又一次看起来非常低效,并且不包括客户端的安全离线使用(如果 RTDB 上的角色发生变化)。
进行基于客户端的身份验证调用,然后触发强制性的第二个基于客户端的调用以从 Firebase 函数(或任何其他后端服务)检索授权数据似乎也很低效实施 Firebase 管理库。
主要问题:有没有办法通过 JavaScript 通过对后端的单个请求并在客户端进行处理来实现 setting/retrieving 来自 Firebase 身份验证服务的身份验证和授权数据的目标?
您提供的两个选项是自定义角色的惯用方法。
如果您将角色作为自定义声明嵌入到用户的令牌中,您将在身份验证请求中获得它。由于这是提升权限的操作,因此应该在受信任的环境中完成,例如您控制的服务器、Cloud Functions,或者(如果不经常)从您的开发机器。
如果您不想这样做,并且想将其存储在数据库中,您将需要一个额外的请求。该调用的开销通常不是性能问题。
两者的组合也是可能的:手动识别初始 "system administrator" UID,然后在您的数据库安全规则中使用它以允许向其他用户授予额外的权限。但这也将在数据库中具有角色。
与其寻找不使用这些惯用方法的理由,我建议您实施一种方法,看看您的顾虑是否在实践中浮出水面。
我正在构建一个使用 Firebase、Firebase JavaScript SDK、Firebase 身份验证服务和实时数据库的客户端。
根据许多不同的来源,我的身份验证部分运行良好,但我发现授权选项有限,我认为这是一个有效的解决方案。
我想要做的是将role: 'admin'
中的单个key/value附加到用户的授权记录,这样我就可以进行身份验证和授权只有一次基于客户端的 Firebase 后端调用。
我读过有关将自定义声明附加到 Firebase 身份验证记录的信息,但我只看到人们使用 Firebase Admin 库(后端)来设置令牌和解析令牌。如果可以的话,我尽量不通过 Firebase 函数或自定义 Express 服务器添加额外的调用。
向 RTDB 添加单独的用户配置文件记录很容易,我可以将身份验证数据存储在那里。然而,这将始终需要同时调用身份验证和授权,这又一次看起来非常低效,并且不包括客户端的安全离线使用(如果 RTDB 上的角色发生变化)。
进行基于客户端的身份验证调用,然后触发强制性的第二个基于客户端的调用以从 Firebase 函数(或任何其他后端服务)检索授权数据似乎也很低效实施 Firebase 管理库。
主要问题:有没有办法通过 JavaScript 通过对后端的单个请求并在客户端进行处理来实现 setting/retrieving 来自 Firebase 身份验证服务的身份验证和授权数据的目标?
您提供的两个选项是自定义角色的惯用方法。
如果您将角色作为自定义声明嵌入到用户的令牌中,您将在身份验证请求中获得它。由于这是提升权限的操作,因此应该在受信任的环境中完成,例如您控制的服务器、Cloud Functions,或者(如果不经常)从您的开发机器。
如果您不想这样做,并且想将其存储在数据库中,您将需要一个额外的请求。该调用的开销通常不是性能问题。
两者的组合也是可能的:手动识别初始 "system administrator" UID,然后在您的数据库安全规则中使用它以允许向其他用户授予额外的权限。但这也将在数据库中具有角色。
与其寻找不使用这些惯用方法的理由,我建议您实施一种方法,看看您的顾虑是否在实践中浮出水面。