我想使用 Firebase Auth 进行用户登录/注册过程。其他一切都应该由我自己的后端处理(spring boot 应用程序 + postgres db)。
现在我问自己如何将新创建的用户同步到 postgres 中的用户表。我想到了以下几点:
问题:如果我的后端调用失败但注册过程成功怎么办?这将导致不一致的状态,因为(至少这是我的理解)我无法轻松回滚。这将导致用户可以在我的后端不知道用户的情况下登录我的应用程序的情况。这将使我的所有后续查询崩溃/无效(例如,在用户 xyz 之后搜索将导致没有结果,即使他/她存在)
在这里,我将从数据库中查询 uid(我从 jwt 获得),如果每个传入请求中不存在该用户,则创建一个新用户。
问题:用户查询对于每个传入请求来说都是不必要的开销。
问题:我不知道当我的外部休息调用此时失败时会发生什么。我可以回滚注册吗?我还会再参加这个活动吗?我也可能会遇到最终一致性的情况,因为我不知道云函数何时触发。此外,我不想将云函数包含在我的堆栈中
有什么办法可以以交易方式做到这一点吗?还有其他人尝试过使用某种模拟吗?
感谢您的每一次帮助!
显然,我终于想出了一个不同的解决方案:
稍后,当您启动应用程序时,您只需检查传递的令牌是否包含自定义声明,如果不包含,则打开注册/登录页面。 除注册端点外,每个端点都应检查声明是否已设置。如果不是就禁止请求。
最简单的方法实际上是不同步身份验证数据,而是在后端代码中解码并验证用户的ID令牌。
此操作(按照设计)是无状态的,尽管 Firebase 自己的后端服务通常会实现最近解码的令牌的缓存,以加快使用相同 ID 令牌的未来调用速度。
您可以使用 Firebase Admin SDK 从后端而不是从客户端创建用户帐户。 因此,首先在数据库中创建用户,然后获取 ID 并使用它在 Firebase 中创建具有相同 ID 的用户。
如果一切顺利,请向客户端发送确认信息并使用他们输入的相同凭据进行登录。
为什么不在后端服务中创建一个端点并在客户端身份验证成功时调用此端点?
这个方法应该做两件事:
此解决方案还允许您以相对较小的成本(1每次登录都会接到电话)
您可以通过修改身份验证服务器将 Firebase 身份验证与自定义身份验证系统集成,以在用户成功登录时生成自定义签名令牌。您的应用程序接收此令牌并使用它通过 Firebase 进行身份验证。