OAuth2.0是一个安全的授权协议,可以为开放平台解决身份验证及授权的需求。很多开放平台都使用这种方式来提供OPEN API。
值得一提的是,OAuth2.0不兼容OAuth,等于OAuth已经GG了。
主要参考:
https://cloud.tencent.com/developer/news/229775
https://blog.csdn.net/sky786905664/article/details/52134585
http://wiki.connect.qq.com/
OAuth2.0的理论基础
关键在于用户同意授权。
比如B是提供open api的QQ,A是第三方客户端sf.gg(思否网站),A想要做QQ登录的功能,A和B互不信任,B要保证自己的信息安全不泄露给A,怎么做?理论上是无法做到的,因为B无论提供什么数据,都有可能被A保存。但是,假如我是B的用户,我在登录A网站的时候,我同意A网站获取我在B网站的数据,这时候B就没有理由拒绝A网站获取我在B网站的数据了,因为是身为B网站信息所有者的我同意了,你没有理由拒绝。这时候再加上B网站在提供open api的时候控制信息的提供范围,比如只提供用户在B网站保存的昵称而不提供密码,这样,开放平台的授权,实现OAuth2.0协议,是可能的。
OAuth2.0的四种模式
四种模式,在四种不同的场景下使用不同的模式实现认证授权。OAuth2.0为这四种场景分别给出了四种解决方案,称之为四种模式,分别为:授权码模式(authorization code)、简化模式(implicit)、密码模式(resource owner password credentials)、客户端模式(client credentials)。
你不必纠结于这些没听过的名词,知道有这么个东西就行了。接下来将先介绍四种场景再介绍四种模式,一些文章直接先介绍模式再介绍使用的场景显然是本末倒置的,肯定是现有问题出现,然后才有的解决方案。
1、第三方Web服务器端应用与第三方原生App
这种场合是开放平台常用的场合:open api的提供者不信任一切的客户端。open api的提供者并不信任客户端应用。如果A网站想要调用B提供的open api,那A网站必须在B的平台上备案,备案成功了,B给A网站一个应用编号id和密钥key。在然后A网站就可以做B网站的第三方登录了。
假设B网站是QQ,用户访问A网站时,看到A网站提供了QQ登录功能,点击了QQ登录,这时候跳转到了QQ提供的第三方登录页面(请注意这个页面是QQ的并不是A网站的),这个QQ登录页面可以输入QQ的账号密码,输入成功,代表你同意了A网站获取你的信息(这个信息的开放范围由QQ控制,一般不会太多),然后这个QQ登录页面又会跳转到A网站,同时给A网站一个code值(这个code代表了你同意A网站获取你在QQ上的信息),然后A网站使用在QQ上备案过的id和密钥key,再加上刚才给A网站的code值,用这三个参数,去换取token值,获取token值之后,A网站就可以使用token值来请求你在QQ上的数据信息了。
我们分析下这个过程。A网站在QQ上备案过了,获取到了id和密钥key(密钥key要绝对保密不能泄露,而id却是可以公示的),用户在A网站点击“使用的QQ登录”时,A网站使用自己的id向QQ发起请求转到QQ授权登录页面,当用户在QQ的授权登录页面输入了账号密码同意A网站获取信息,并且返回了code值,这个code值,QQ是知道提供给了哪个网站的,并且也知道这个code值对应了哪一个用户。然后转到了A网站。这时A网站再使用id、code值和绝对保密只有自己知道的key,就可以获取token。就算非法分子拿到了id和code(这两个值在页面跳转连接中会作为url参数所以对所有人是透明的),不知道key,也无法非法获取用户信息。
其中的code值便是授权码,这便是——授权码模式。
2、第三方单页面应用
上面的第一种情形,要求A网站必须拥有服务器,这样才能保存key值和发送请求获取token。但是对于一些纯展示的网站只有html+css+js,是行不通的。
这时候就要简化授权码模式,称为简化模式。简化模式应用比较少并且简单,就带过了。
3、第一方单页应用与第一方原生App
open api的开发本就是为自己的APP或者应用提供接口,就可使用密码模式。
我觉得密码模式和开放平台都没关系了,就是为自己的应用写接口,就是一个应用(或者是分布式应用)。假如你有一个app名字叫做支付宝(哈哈),然后你为这个支付宝写了一个后台,每个用户登录的时候就用自己的账号密码登录,登录后得到一个token值,以后就用token值请求数据就行了,和Basic Auth有点像。
4、没有用户参与的,完全信任的服务器端服务
客户端模式。最简单,密码都不用输入,A网站只有请求就给A网站提供数据。
在开放平台中,常用的也就是授权码模式了吧。密码模式可以给自己的APP写接口时使用。其它两种用的太少了。
QQ授权登录
QQ授权登录就是一个典型的OAtuh2.0开发例子也是一个很好的学习教材,开发文档写的很详细