将 firebase auth 迁移到 pocketbase 的方案
背景
之前花了很大的功夫去实现国内使用 firebase auth,但是仍然存在一些问题:
- 仅仅对 auth 进行了处理,想要用其他服务,还需要额外的处理。
- auth 也没有处理完全,比如说“忘记密码”。
- firebase 毕竟是第三方,不太可控,不好扩展。
- 之前的方案也是弯弯绕绕,未必可靠。
选型
几个以前就开始关注相关的项目,进入范围的大概是:
- supabase,appwrite,pocketbase 之类偏重的实现。这些项目不仅提供了 auth,还包含了 storage,push,func,db 等等功能。这其中 pocketbase 又相对轻量。
- better auth,logto,clerk 之类纯 auth 的项目。
之前本想着选 supabase,一劳永逸。可在开始实现的时候又发现 pocketbase 比较符合自己的需求。pocketbase 的好处是:
- 轻量,单文件部署。
- 简单,仅仅提供了 auth,db,storage。
- 前端提供了 dart、js sdk,后端则是 go,完美符合我的技术栈。
不足是:
- 不提供 ui。
- 目前还处于 beta 阶段,1.0.0 之前可能有 break change。
- auth 加密算法和 firebase auth 不同,无法平滑迁移。
再次吐槽下,国内几个大厂没有一家愿意做 firebase。
迁移方案
在项目已经运行了几个月 firebase auth 的情况下如何进行迁移呢。
之前提到了,无法把 firebase auth 的用户平滑迁移到 pocketbase。我们需要用户至少一次重新输入账号和密码,但又要保证尽量少的影响用户的体验。要做到这一点,我们要分情况讨论:
- 新用户,直接使用 pocketbase auth 进行注册、登录、绑定。
- 老用户,firebase auth token 未过期,判断是否已经绑定激活:
- 已绑定,还是按照原来的方式进行对订单的判断,直到过期。
- 未绑定,直接使用 pocketbase auth 进行注册、登录、绑定。这部分用户应该不多。
- 老用户,firebase auth token 已过期,在登录时进行判断:
- 如果能通过 pocketbase auth 验证,说明已经有 pocketbase 账号,无需处理。
- 如果无法通过 pocketbase auth 验证,通过 kv 数据库判断邮箱是否有对应的订单 id。
- 如果 kv 数据库存在邮箱和订单数据,直接通过 pocketbase auth 为用户进行注册,并绑定订单。
- 如果 kv 数据库不存在邮箱和订单数据,需要具体分析。有可能是订单太早,没有存在数据库中;可能是邮箱根本没有注册过。这时候需要人工介入。