将使用 Firebase Auth 创建的用户同步到我的自定义后端

问题描述 投票:0回答:5

我想使用 Firebase Auth 进行用户登录/注册过程。其他一切都应该由我自己的后端处理(spring boot 应用程序 + postgres db)。

现在我问自己如何将新创建的用户同步到 postgres 中的用户表。我想到了以下几点:

  1. 通过客户端进行 REST 调用 - 每当我从 firebase sdk 收到成功事件时,我都会向后端调用一个额外的请求,该请求发送 uid、用户名等。

问题:如果我的后端调用失败但注册过程成功怎么办?这将导致不一致的状态,因为(至少这是我的理解)我无法轻松回滚。这将导致用户可以在我的后端不知道用户的情况下登录我的应用程序的情况。这将使我的所有后续查询崩溃/无效(例如,在用户 xyz 之后搜索将导致没有结果,即使他/她存在)

  1. 检查postgres数据库中该用户是否存在

在这里,我将从数据库中查询 uid(我从 jwt 获得),如果每个传入请求中不存在该用户,则创建一个新用户。

问题:用户查询对于每个传入请求来说都是不必要的开销。

  1. 使用云函数触发 - 当我理解正确时,当在云函数中创建新用户时,firebase auth 会触发事件。这可用于进行外部 api 调用。

问题:我不知道当我的外部休息调用此时失败时会发生什么。我可以回滚注册吗?我还会再参加这个活动吗?我也可能会遇到最终一致性的情况,因为我不知道云函数何时触发。此外,我不想将云函数包含在我的堆栈中

有什么办法可以以交易方式做到这一点吗?还有其他人尝试过使用某种模拟吗?

感谢您的每一次帮助!

firebase firebase-authentication google-cloud-functions
5个回答
2
投票

显然,我终于想出了一个不同的解决方案:

  1. 根据 Firebase SDK 注册用户(例如使用电子邮件 + pw 方法)
  2. 对我自己的注册 api 进行后期调用,包括上一步生成的 uid 和一些元数据
  3. API 创建一个新用户,其中包含带有 UID 的列 + 获取用户的 firebase 令牌,并添加通过 Admin SDK 引用内部 Postgres UUID 的内部声明。
  4. 前端获取创建的用户并硬刷新(非常重要,因为之前获取的令牌不会包含新添加的声明!)firebase 令牌并验证它是否包含该令牌。如果确实如此 -> 一切都很酷,如果没有发生一些糟糕的事情:) 这将需要重试请求。

稍后,当您启动应用程序时,您只需检查传递的令牌是否包含自定义声明,如果不包含,则打开注册/登录页面。 除注册端点外,每个端点都应检查声明是否已设置。如果不是就禁止请求。

如何设置自定义声明: https://firebase.google.com/docs/auth/admin/custom-claims#set_and_validate_custom_user_claims_via_the_admin_sdk


1
投票

最简单的方法实际上是同步身份验证数据,而是在后端代码中解码并验证用户的ID令牌

此操作(按照设计)是无状态的,尽管 Firebase 自己的后端服务通常会实现最近解码的令牌的缓存,以加快使用相同 ID 令牌的未来调用速度。


1
投票

您可以使用 Firebase Admin SDK 从后端而不是从客户端创建用户帐户。 因此,首先在数据库中创建用户,然后获取 ID 并使用它在 Firebase 中创建具有相同 ID 的用户。

如果一切顺利,请向客户端发送确认信息并使用他们输入的相同凭据进行登录。


1
投票

为什么不在后端服务中创建一个端点并在客户端身份验证成功时调用此端点?

这个方法应该做两件事:

  1. 解码令牌以访问 Firebase 用户对象(Firebase 管理员)
  2. 将 Firebase 用户与您的内部用户表进行比较。如果它不存在,您可以使用 firebase 用户对象创建它,否则什么都不做。

此解决方案还允许您以相对较小的成本(1每次登录都会接到电话)


0
投票

您可以通过修改身份验证服务器将 Firebase 身份验证与自定义身份验证系统集成,以在用户成功登录时生成自定义签名令牌。您的应用程序接收此令牌并使用它通过 Firebase 进行身份验证。

了解更多

© www.soinside.com 2019 - 2024. All rights reserved.