前言
今天注册杭电OJ账号时发现能qq登陆,点了用手机扫二维码成功登入,但要求与该OJ系统已有账号绑定,这引发了我对第三方登陆的思考,要绑定的吗?印象中有的要绑定,有的qq登陆后就不用处理了能正常使用了,一直没弄明白也没去想,虽然是很老的东西了,但自己理解了的就值得记录。
理解
A系统(网站或app)使用了qq第三方登陆,即意味着有至少有2种方式可能登陆,一种是通过qq登陆,另一种是通过系统账号登陆(非必定存在)。
通过qq登陆
- A系统用户表设计举例,字段:username,password,关联qq号
- 流程:
- 用户在A系统界面填写qq账号密码(或用手机qq扫二维码)。
- A系统将qq账号密码用curl或guzzle等方式post到qq指定的接口
- qq服务器进行验证,匹配返回true及qq账号,qq头像,昵称等qq对A系统授权的数据,否则返回false。
- 若返回的是true,A系统在用户表关联qq字段找qq账号,存在则显示登陆成功
- 流程说明
- 第一步的数据肯定经过加密,A系统是无法看到的,qq服务器才有密钥。这才能保证用户的qq机密数据不泄露,但具体是如何实现的呢?在客户端就对输入进行加密?也没用啊,客户端代码是A系统写的,我不按qq文档的要求加密qq也发现不了啊。
- 第三步的授权数据具体是什么由第二步请求qq服务器时带的参数决定
用户表设计
第一种方式是用户表字段完全采用qq授权数据,即该系统的username就是账号,密码就是qq密码,那意味着:
- 用户修改qq昵称后登陆A系统,A系统的该用户昵称同步了。
- 用户qq登陆后: 不需再填写用户名,密码,下次也只能通过qq登陆,不存在A系统账号密码的登陆方式。
第二种,系统的user表正常设计,额外做的是加上关联qq字段,用另一种qq-user表来存第三方登陆数据,这样的好处是:
- 表结构更清晰,qq返回的如头像,昵称等数据存在qq-user。
- 可以方便加入另一种第三方登陆,如加入微信登陆,只需加wechat-user表,和user表加字段关联微信。
而这样设计,用户首次qq登陆后,需要绑定user表存在的某用户,用户既可用qq登陆也可用A系统用户账号密码登陆