ucenter是康盛(现属腾讯)开发的用户中心系统,用来打通旗下各个产品,如discuz,ucshop等。前段公司的一个需求是,要求ecstore和discuz打通,可以共享会员,经过一段时间的研究和使用,现介绍ucenter的使用和原理。
流程
现在假设有两个web应用,一个是商城,一个是bbs,要求在任何一个app上对会员进行的任何操作都可以同步到另一个app上,比如:
- 会员在商城注册,没有在bbs上注册,但是在商城注册的账号可以在bbs上使用。
- 会员在商城登录,直接访问bbs时,不用输入账号密码,就已经是登录状态,可以进行下一步的操作。
- 以上2步操作反过来也可以成立,即在bbs上的操作也会同步到商城。
原理
如果用户的操作是从商城开始的,数据走向是这样的:
- 用户在商城注册。
- 商城把祖册用户的信息插入数据库,并把添加一个用户的信息加密后发送到ucenter系统。
- ucenter接收数据,分发给相应的API,API解密数据,然后把数据插入到ucenter的数据库中。
- ucenter查询除商城外绑定的其他应用,假如现在只有一个应用bbs,用socket的方式通知bbs的相应借口,增加一个用户。
- ucenter又返回给商城一段js代码,js代码的src是bbs的接口地址。
- 商城接收到js代码,偷偷图把代码放在页面上,用户不可见,但是浏览器已经访问了bbs相应的接口。
- bbs接收数据并解密分发到具体的函数,函数查询此用户并设置bbs的session和cookie。
- 用户在没有知觉的情况下,已经登录了bbs。
- 用户访问bbs,发现自己已经是登录状态。
- 用户发了一个帖子说:这家公司做的数据连同真方便。
- 用户逛了一会儿,退出了登录,于是1~9的过程重复了一遍,只是借口和相应执行的函数不同,回到商城的时候,变成了访客状态。
开发者需要做什么?
虽然ucenter提供了很好的SDK,但开发者的工作量还是比较大的,要知道在原理一栏只是一个注册和登录的过程,真正要实现会员共享,还包括有会员的增删和改,甚至是积分和头像的更换,每一步操作都需要写严密的接口。这些接口的操作多数时候在:
- 查询数据库。
- 设置session和cookie。
- 返回正确的值。
最佳实践
如果商城,bbs和ucenter系统装在同一台机器上,就可以采用mysql的方式同步数据。这样的好处是速度快,不好的地方是不利于扩展,如果将来把商城单独部署到一台服务器上,那么原来的配置就会出问题。
所以我建议以下几点:
- 不要用mysql的方式连同,而应该用远程的方式连同,方便扩展。
- 允许延时,不要每一步都检查用户中心。在实际使用过程中,会存在ucenter挂掉的情况,这样,商城注册的用户是无法立即同步到bbs的。