如今几乎大部分的App
都支持使用多个第三方帐号进行登陆,如:微信、QQ
、微博等,咱们把此称为多帐号统一登录。而这些帐号的表设计,流程设计相当重要,否则后续扩展性贼差。本文不提供任何代码实操,可是梳理一下博主根据我司帐号模块的设计,提供思路,仅供参考。html
该设计的思路是每一个手机号对应一个用户,手机号为必填项。git
流程:github
Redis
中,并设置必定的过时时间(过时时间通常是5分钟,这就是咱们通常手机验证码的有效期),最后将验证码经过短信发送给用户。Redis
里面这个手机号对应的验证码是否一致,,失败就返回错误码,成功就给用户建立一个帐号和保存密码。手机号+密码
进行登录。问题:安全
该方案的思路是弱化密码的必填性,即不管用户是否注册过,可经过
手机号 + 验证码
直接进行登录(保留手机号 + 密码
登陆的方式)。服务器
流程:微信
Redis
中,并设置必定的过时时间(过时时间通常是5分钟,这就是咱们通常手机验证码的有效期),最后将验证码经过短信发送给用户。Redis
里面这个手机号对应的验证码是否一致,失败就返回错误码,成功就直接登陆。若是是老用户,直接拉取用户信息;若是是新用户,则提示他能够完善用户信息(不强制)。手机号 + 验证码
登陆后,也可选择设置密码,而后就能够经过手机号 + 密码
的方式登陆,即:密码是非必填项。用户表设计:网络
id | user_name | user_password | user_mobile | state | more |
---|---|---|---|---|---|
用户id | 用户名 | 用户密码 | 手机号码 | 帐号状态 | 其余信息 |
进入 Web2.0
时代 ,微博开放了第三方网站登陆, 产品说, 这个咱们得要, 加个用微博账号就能登陆咱们的App
吧,并且得和咱们本身的用户表关联。ide
流程:post
access_token
,经过access_token
调取API
接口获取用户信息。微博用户信息表设计:优化
id | user_id | uid | access_token |
---|---|---|---|
主键id | 用户id | 微博惟一id | 受权码 |
紧接着, QQ
又开放用户登陆了, 微信开放用户登陆了,网易开发用户登陆了。。。。。。一会儿要接入好多家第三方登陆了, 只能按照 “微博用户信息表” 新建一个表,重写一套各个第三方登陆。
手机号 + 密码
, 仍是 手机号 + 验证码
, 都是一种 用户信息+密码
的验证形式;用户信息+密码
的形式, 用户信息即第三方系统中的 ID
(第三方系统中的惟一标识), 密码即 access_token
, 只不过是一种有使用时效按期修改的密码。用户基础信息表:
id | nickname | avatar | more |
---|---|---|---|
用户id | 昵称 | 头像 | 其余信息 |
用户受权信息表:
id | user_id | identity_type | identifier | credential |
---|---|---|---|---|
主键id | 用户id | 登陆类型(手机号/邮箱) 或第三方应用名称 (微信/微博等) | 手机号/邮箱/第三方的惟一标识 | 密码凭证 (自建帐号的保存密码, 第三方的保存 token) |
说明:
用户基础信息表
+ 用户受权信息表
;手机号 + 验证码
沿用以前的方案。
邮箱/手机号 + 密码
:用户填写 邮箱/手机号 + 密码
; 请求登陆的时候, 先判断类型, 如手机号登陆为例:
使用 type= 'phone'
结合 identifier= '手机号'
查找, 若有, 取出并判断 password_hash
(密码)是否和该条目的 credential
相符, 相符则经过验证, 随后经过 user_id
获取用户信息;
查询type= 'weixin'
结合 identifier= '微信 openId'
, 若是有记录, 则直接登陆成功, 并更新token
; 假设与微信服务器通讯不被劫持的状况下无需判断凭证问题。
优势:
phone_verified
和 email_verified
, 现在只要在 user_auths
表中增长一个统一的 verified
字段, 每种登陆方式均可以直观看到是否已验证状况;user_auths
添加相应的时间和 IP
地址, 就能够更加完整地跟踪用户的使用习惯, 好比:已经不使用微博登陆两年多, 已经绑定微信 300天;缺点 :
邮箱 + 新密码
, 手机号 + 旧密码
均可以登陆, 确定是很诡异的状况;回顾一下手机号 + 验证码
的登陆方式:
但回过头来想一下,为何咱们须要验证码?验证码的做用就是肯定这个手机号是你的,那除了使用短信,是否还有别的方式对手机号进行认证?
SIM
卡数据查询到。这就是该部分的主角:一键登陆。
获取到当前手机使用的手机卡号,直接使用这个号码进行登陆,这就是一键登陆。
这种登陆方式的好处是显而易见的。它能够更方便、快捷地完成注册、登陆流程,将本来可能须要 20 秒的流程,缩短到了 2 秒左右,很大程度上提高了登陆的用户体验。
主要步骤以下:
目前阿里云已经提供了该方式并可兼容三大运营商的号码,详见阿里云SDK
博主看来,没有最好的方案,选择适用当前系统的设计便可。不要深究孰优孰劣,鞋合不合脚,只有脚知道。