在这个一切上云的时代,BaaS 对客户端工程师实在是过于友好。能够低成本建立一个完整的产品,不用忙碌于后端运维。加上全自动的负载均衡和灾备扩容,让人能省下大把的精力时间来专注于业务。

然而,即使成本再小,服务端的开发也是必备的。就算数据库完全不用管,总得写监控一下每日的关键流量吧?对开发人员特别友好的,有 Bmob 和 LeanCloud 之类,集成了很多实用的功能,非常方便。而自定义程度更高,相对更需要底层设计的阿里云,腾讯云之类,就容易满足一些复杂的场景。

出于成本和效率上的原因,经过重重考证后,我在一个新项目上完全迁移到了腾讯云。此次简单用户系统的搭建,是对其云开发产品的具体实践。

何为云开发

简单的说:就是把数据库、云函数、云储存和静态网页托管集成到一个环境中。每个项目绑定一个独立环境。

以前我用的最多的是阿里云 + Bmob 组合,因为前者的数据库太贵,后者的云函数太贵 🤣 云开发除了价格低廉外,最大的特色是对 Flutter 的高度支持。相比于 Bmob 还需要自行处理序列化的 SDK,云开发的调用更加简单直接,而且其独立的 ticket 用户鉴权方案,也很方便与自有的用户系统对接。

着重要说的一点是,其文档型数据库支持以集合(表)为单位进行权限控制,安全规则使用 json 格式和表达式配置,非常简单直观。配合上动态 ticket 的客户端鉴权模式,应该说安全性是非常好的。而且云函数对数据库的操作不受规则影响,灵活程度也很高。

简单用户系统

云开发自带的用户管理只是个负责鉴权的核心,除了微信的 openId 那一套,其余的都需要自己实现。

也就是说,所谓的用户表和注册登录验证的流程都需要具体设计。

自定义登录的流程

先说一下这个授权的过程,也是后面流程设计的依据。

流程图

上图取自官方文档,可见是先验证登录,成功后返回由用户 UID 生成的 ticket,再凭此对云开发资源进行访问。

这样就造成了一个问题,如果用户系统也构建在云开发上,那么登录之前怎么读写数据库呢?

未登录状态的交互

匿名登录

官方提供了一个匿名登录的方法,不需要服务端操作,设置好对应资源的访问权限即可。

匿名登录后,这个用户状态会一直留在设备上,不会过期。也有接口将其转化为新的自定义登录用户,相当于新建一个 UID,然后连接到生成的 ticket 上,之前的私有数据都会保留。

这种方法的缺陷在于:

  1. 规定每个环境最多生成 1000 个匿名用户。
  2. 匿名登录状态虽然可以保存私有数据,但是并不稳定。如果卸载后重装 App,会生成新的匿名用户。

此外,据测试在后台的用户管理中也看不到匿名用户的信息,所以管理起来还是有点麻烦。

借助云函数

云函数可以单独控制访问权限,是否能够 Http 调用,调用时是否需要鉴权。

而且服务端 SDK 自带管理员权限,做起验证来没什么限制,只要在这个接口上确保安全即可。

因此通过设置就可以获得开放的公网接口,用来进行登录前对环境的访问。

这种方法实现了完全不带状态的未登录交互,如果使用了第三方的 SDK,也方便在这做一些访问隔离。对外暴露一个安全的接口,把密钥啥的都留在服务器上。

数据集合设计

因为文档型数据库的特点,以及独立的访问鉴权,用户集合并没有像表一样把信息都写在一起,而是根据需要(主要是登录前后的权限处理)做了拆分。

需求:比较简单的用户系统,唯一邮箱 + 密码注册登录,凭邮箱重置密码,可冻结账户。

所需集合:

集合名
字段
说明
user_auth
uid
邮箱,即唯一用户ID
pass
注册成功后经过加盐MD5处理的登录凭证
state
账户状态,0为正常,其它为异常,会影响使用
访问权限:读 - 无限制,写 - 仅允许管理员

  

集合名
字段
说明
user_info
_openid
通过登录验证,根据邮箱获取ticket后,云开发创建的唯一用户ID
name/XXX
用户的昵称,或者其他私有信息
created_date
账户创建时间,注册成功之后自动创建
latest_avtive_date
账户最后一次活跃时间,不一定是登录,根据具体业务更新
访问权限:读 - openID对应,写 - openID对应 (每个用户仅能读写自己的数据)

功能实现流程

一图胜千言 👇

功能流程图

总而言之:访问的核心验证依靠登录后的ticket鉴权,未登录状态下通过云函数调用后端资源。

总结与归纳

就开发而言,便捷性和可控性一般不可兼得。比如集成较为全面的平台,往往自带邮件确认重置密码功能,设置好模板即可,非常方便。但在各种功能的搭配上,选择的余地就不多了,自定义程度也有所限制。而更为底层的云平台,一切都需要你自己安装部署,绝对的控制权带来的就是麻烦和风险。

腾讯云开发提供了一个比较折中的方案,质量可靠,而且价格对于个人开发者十分友好。

大力支持,希望长久😁

参考链接: