用户系统设计(下)第三方授权、账号绑定及解绑
------------想跳过上篇问题回复可直接下滑------------
之前总结了用户系统登录和注册及帐号打通的问题。有两个问题大家争议得比较多,第一是为什么不完全打通,为什么每一个app要保留自己的用户资料和绑定关系;第二就是不应该用手机号作为唯一的识别方式。先说一下第一个是否完全打通的问题,取决于同一个开发者的app是否需要或者能够让用户感知到这些app都是属于同一个开发者的,很容易让用户感知到“哦,这些都是一家公司的”,那么完全打通,用户信息、绑定关系是通的用户是完全有预期的,这是可以的。并且完全打通对于开发来说可以说得上是一个一劳永逸的事情,之后的app用户系统这一块可以说没有开发量,直接接入。我们可以简单归纳一下现在主流的用户系统服务端设计:
1、app级的用户系统,根据手机号邮箱注册或第三方授权创建用户身份,用户的身份信息、账号绑定、个人资料都保存在app服务端也只对单一app有效;普遍中小app都是采用的此种。
2、公司级用户系统,根据手机号邮箱注册创建用户身份,用户的身份信息、账号绑定、个人资料都保存在统一的公司用户系统服务端,对接入的app有效,app端有读取修改权限;
3、平台级用户系统,根据手机号邮箱注册创建用户身份,用户的身份信息、账号绑定、个人资料都保存在统一的公司用户系统服务端,选择极少信息提供公开接口,接入的app只有读取权限;例如qq微博微信等第三方授权。
其他两个不展开,关于公司级用户系统可以举两个典型的例子,感兴趣的朋友可以体验一下,第一个是网易第二个是百度。大家可以回顾一下两个公司的常用app。就我而言,网易是云音乐、考拉海购、网易有钱等,百度是百度地图、百度糯米。可以再去多去下载几个体验。网易公司的用户系统是网易邮箱去承载,但是承担的功能仅是提供一个用户身份即unionID,用户的资料、帐号、第三方登录等都是app自己去实现的;百度公司的用户系统是百度账号去承载,承担的功能除了提供用户身份unionID外,用户资料、第三方登录都是保存在用户系统的,app端有修改权限用户系统资料;两家的用户系统都没做账号绑定的事情,我认为原因可能是他们建立用户系统的时候还不存在繁琐的账号绑定,后期想加上牵扯到新老账号的数据合并问题是很头疼的问题。而关于用户资料是存在app端还是用户系统,网易是存在app端,百度是存在用户系统,这两家公司区别的原因我分析有二,1)百度系app本身是偏工具的,浏览器、地图、网盘等等对于用户资料和个人中心没有太多的定制化需求只需要基本的头像昵称即可,所以将用户资料这块保存在用户系统,app端基本直接接入即可;网易类是比较重用户资料和个人中心一点的,简单的通用的并且是同步到所有app的设计是无法满足各app产品的,所以选择自建。包括百度需要有稍强一点的用户资料的app(例如百度音乐)都会在用户系统的基础上在app端去自建和完善用户资料。
第二个问题即不能将手机作为唯一标识的担心实际是1、用户手机号更换后无法找回密码;2、旧手机号码被重新激活后账号信息泄露。这个问题实际上需要的是安全验证。一般有以下方法:1)账号绑定与解绑;2)设置安全问题;3)app用户行为验证;4)账号申诉。所以只要做好安全验证问题用手机号做为唯一标识也没有问题,当然第二个问题事关运营商,查了下资料作为互联网服务商上技术上是无解的,只能尽可能提醒用户绑定与解绑手机。
-------------回答遗留问题的分割线-------------
继续补充第三方授权登录和账号绑定与解绑。
(二)第三方授权登录
上篇文章我们介绍过第三方授权的用户不是用户系统的用户,仅是单一app的用户,此原则在此篇仍适用。第三方授权是为app注册登录提供一种便捷的方式和补充。那么第三方授权的登录和注册是怎么回事呢?简单来说就是第三方有一个公开的授权接口,你有权访问并起用户确认后能够返回此用户在第三方的身份openid,可作为app生成自己用户身份的验证。
1.主流程图
第三方授权注册登录调取第三方sdk,查询此openid是否已有appuserid;
若是,登陆;若否,创建appuserid并将基本资料存入app服务端;
(三)账号绑定
账号绑定分为绑定手机号和绑定第三方授权账号。第三方授权能够给用户提供便捷的注册和登录方式,这是好的一点,但是正因为操作太便捷没有参与感所以用户很容易忘记自己的登录方式。账号绑定到目的就是避免用户忘记登录方式,每次授权都在app内创建一个用户身份,不利于用户操作的同时也不利于产品用户信息留存。所以产品设计上来讲用户的登录和注册方式尽量简单、多种,但是尽量在非必要非用户自主想创建另外账号的情况下尽量一个用户在一个app只存在一个身份。
1.主流程图
绑定手机号绑定手机号
Step1:用户输入手机号点击获取验证码,客户端进行基本判断(后面详细介绍)后,app服务端发送验证码;
Step2:用户系统服务端验证用户的手机号是否已存在对应的appuserid;
若是,提示此号已绑定,先更换绑定手机号
若否,用户系统按照手机号注册流程,用户系统创建unionid,将union传给app并关联当前登陆的appuserid,绑定成功
绑定第三方授权
App服务端查询账号信息,是否存在appuserid;
若是,提示此号已绑定,建议先解绑;
若否,将此第三方授权openid绑定到登陆的appuserid中;绑定成功
(四)账号解绑
账号解绑也分为手机号和第三方授权。手机号只允许更换绑定不允许解除绑定。更换绑定的场景就在于用户更换了手机号,为了账号安全将之前的信息迁移到新的手机号中,并将更换的原手机号从系统中删除,若再次注册将视为新账号。
1.主流程图
账号解绑更绑手机号
Step1:原手机号+验证码,app服务端验证是否为真,为真发送验证码;
Step2:新手机号+验证码+密码,app服务端验证手机号+验证码是否为真,为真进行step3
Step3:用户系统服务验证此手机号是否已存在unionid;
若是,提示更绑失败
若否,将新手机号替换原手机号,关联原手机号unionid,appuserid;并将原手机号从用户系统中删除;
解绑第三方授权
Step1:当前第三方授权是否已经绑定手机号,若是,成功解绑;若否进行step2;
Step2:当前第三方授权是否绑定其他第三方授权登陆,若是进行step3,若否提示无法解绑,首先请绑定手机号;
Step3:当前第三方授权是否为最早一个绑定(即注册账号);
若是,调取第三方授权登陆页面,用户重新登陆要解绑账号+密码(需要确认是否能抹除用户登录信息要求输入账号密码),登陆成功则解绑成功;
ps:这里被开发同事验证不能抹去登录信息,因为我们只有调取接口的权限。但是当时之所以想要这么设计,是为了账号安全,可以试想一个场景,我把你的账号绑定到我的微信/微博等,然后接触你的账号,相当于这个账号就归我了。--事实证明现在的权限没办法解决这个问题。
若否,解绑成功;