以QQ为例。
QQ有一个资源服务器,资源服务器中有一系列的用户数据,
例如:图片,音乐,用户名,图像,好友等数据。
现在有一个应用,想要获取 QQ的用户数据
最简单的方法就是,QQ开发一个API,通过访问这个API,返回用户的数据
可是某天来了个恶意应用,或者是我们竞争对手发起的请求访问,就会造成我们数据的泄漏,
例如:看到了你的名字,图像,照片,好友等信息。
IP方案
所以,就需要对第三方的应用进行校验,
比如最原始的方法是使用,IP地址,如果是不认识的IP地址就不给他资源。
IP方案的缺点:
- 当客户应用换了IP地址之后,也要同时维护更换 IP地址。
- 当客户应用是分布式部署很多份的时候,就要为同一个用户维护很多份IP地址。
- 重要的是,ip是可以伪装的
这样无疑是繁琐麻烦、难以维护的。
优化:业界的解决方案是给予客户应用一个“出入证”,专业称为访问令牌(Access Token)。
如果来访问的客户应用带有合法的访问令牌,则可以给他数据,否则便拒绝。
Access Token
access Token哪里来的呢?是由一个授权服务器颁发的。
每个允许其访问资源的客户应用,都现在 资源服务器中注册一个appkey,
然后每次用这个appkey,向授权服务器申请Access Token。
这样不论客户应用换不换ip、有多少ip,只要客户应用的appkey是唯一不变的就不用做任何修改,也不用担心ip伪装的问题。
确认授权
还面临着一个问题就是:
当我们获取用户数据的时候,虽然我们允许第三方的客户应用获取用户数据,用户本人却不一定允许。
比如,用户在 QQ系统里存储了图片、文档、视频等数据,用户只允许第三方应用获取头像和名字,
不允许第三方应用获取他的图片和视频。
所以,在颁发给客户应用相关权限的Access Token的时候,需要经过用户的同意。
也就是说,授权服务器授权时,要列出授权访问的资源,让用户勾选可以访问的资源。
OAuth2.0本质
客户端应用向授权服务器请求令牌,与授权服务器颁发令牌的过程标准化,
根据这套标准与解决方案,就可以安全的让第三方应用,访问存储在服务器上的用户数据了