第三方登录原理探究
底层协议
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
OAuth是OpenID的一个补充,但是完全不同的服务。
流程梳理
拿QQ做例子,简单说一下流程:
当用户点击QQ登陆,你会通引导用户跳转到第三方登陆的登陆界面, 当用户成功登录以后会自动跳转回来,并附带一个code参数,接着你使用code就可以获得access token(访问令牌),对于QQ,由于第三方登录结合了Openid, 所以需要再通过token获取openid。
重点:这个openid是和QQ用户一一对应的, 使用access token + openid 即可获取用户信息。
第三方登录的实质
首先说一下登录是实质,就是证明 你是你 , 乍一看好像是一个哲学问题.
接下来做进一步的分析, 在登录过程中, 你所提供的用户名,密码代表了,你的证据,代表了虚拟的 你 .
服务器中储存的用户的数据, 重点在于用户的唯一性, 映射了你在现实世界的唯一性.
登录的完成依赖于你所提供 证据 与 服务器中数据的匹配.
为什么使用第三方登录
那么为什么使用第三方登录, 服务方希望用户注册, 而用户懒得填注册时的各种信息(主要是为了保证用户的唯一性,各种用户名已占用,密码格式限制).而像微信, QQ, 微博等几乎每个人都会安装的应用中用户肯定会在其中某一个应用中已经注册过.证明该用户在已经注册的应用中的唯一性.
第三方登录的实质就是在授权时获得第三方应用提供的代表了用户在第三方应用中的唯一性的openid.并将openid储存在第三方服务控制的本地储存.
第三方登录与本地登录的关联
第三方平台和本地用户系统结合应该分为三种情况:
- 本地未登录,第一次登录第三方:此时相当于注册,直接把第三方信息拉取来并注册成本地用户就可以了,并建立本地用户与第三方用户(openid)的绑定关系
- 本地未登录,再次登录第三方:此时用户已注册,获取到openid后直接找出对应的本地用户即可
- 本地登录,并绑定第三方: 这个只要将获取到的openid绑定到本地用户就可以了
第三方登录解除授权实践
- 已授权状态, 获取用户信息, 可直接获取.
- 解除授权后/未授权状态, 直接获取用户信息, 需要跳转到授权界面.
由此可以发现, 授权状态下,由第三方登录sdk控制的本地储存保存着 access token + openid.解除授权后,第三方sdk清除本地 access token + openid.