将 firebase auth 迁移到 pocketbase 的方案


背景

之前花了很大的功夫去实现国内使用 firebase auth,但是仍然存在一些问题:

  1. 仅仅对 auth 进行了处理,想要用其他服务,还需要额外的处理。
  2. auth 也没有处理完全,比如说“忘记密码”。
  3. firebase 毕竟是第三方,不太可控,不好扩展。
  4. 之前的方案也是弯弯绕绕,未必可靠。

选型

几个以前就开始关注相关的项目,进入范围的大概是:

  • supabase,appwrite,pocketbase 之类偏重的实现。这些项目不仅提供了 auth,还包含了 storage,push,func,db 等等功能。这其中 pocketbase 又相对轻量。
  • better auth,logto,clerk 之类纯 auth 的项目。

之前本想着选 supabase,一劳永逸。可在开始实现的时候又发现 pocketbase 比较符合自己的需求。pocketbase 的好处是:

  1. 轻量,单文件部署。
  2. 简单,仅仅提供了 auth,db,storage。
  3. 前端提供了 dart、js sdk,后端则是 go,完美符合我的技术栈。

不足是:

  1. 不提供 ui。
  2. 目前还处于 beta 阶段,1.0.0 之前可能有 break change。
  3. auth 加密算法和 firebase auth 不同,无法平滑迁移

再次吐槽下,国内几个大厂没有一家愿意做 firebase。

迁移方案

在项目已经运行了几个月 firebase auth 的情况下如何进行迁移呢。

之前提到了,无法把 firebase auth 的用户平滑迁移到 pocketbase。我们需要用户至少一次重新输入账号和密码,但又要保证尽量少的影响用户的体验。要做到这一点,我们要分情况讨论:

  1. 新用户,直接使用 pocketbase auth 进行注册、登录、绑定。
  2. 老用户,firebase auth token 未过期,判断是否已经绑定激活:
    1. 已绑定,还是按照原来的方式进行对订单的判断,直到过期。
    2. 未绑定,直接使用 pocketbase auth 进行注册、登录、绑定。这部分用户应该不多。
  3. 老用户,firebase auth token 已过期,在登录时进行判断:
    1. 如果能通过 pocketbase auth 验证,说明已经有 pocketbase 账号,无需处理。
    2. 如果无法通过 pocketbase auth 验证,通过 kv 数据库判断邮箱是否有对应的订单 id。
      1. 如果 kv 数据库存在邮箱和订单数据,直接通过 pocketbase auth 为用户进行注册,并绑定订单。
      2. 如果 kv 数据库不存在邮箱和订单数据,需要具体分析。有可能是订单太早,没有存在数据库中;可能是邮箱根本没有注册过。这时候需要人工介入。