程序员的自我救赎---3.1:理解Oauth2.0
《理解Oauth2.0》
关于SSO分两个篇章来讲,先讲讲Oauth2.0,之前还特地百度了一下Oauth怎么读,我们每次交流的时候都直接读字母O·A·U·T·H2.0,
这里引用一下:http://how2read.me/questions/oauth, 其实每次开会以及交流的时候很重要的一点就是先定义名字,免得沟通过程中造成困扰。
我们简单一点这个单词就读:“欧斯”;
简单来说Oauth是一套协议,并不属于任何一种技术。只是大家遵守这种协议标准就能很方便的对接。我们也经常讲:“小公司做产品,大公司做标准”.
为此我特地上了一下管网想看看是哪个公司制订的:https://oauth.net/
结果一堆英文我也没找着,不过我在维基百科到是找到了:https://zh.wikipedia.org/zh/OAuth。(注意:要FQ才能看的到。)
我就直接Copy了:
"OAuth开始于2006年11月,当时布莱恩·库克正在开发Twitter的OpenID实现。与此同时,社交书签网站Ma.gnolia需要一个解决方案允许使用OpenID的
成员授权Dashboard访问他们的服务。这样库克、克里斯·梅西纳和来自Ma.gnolia的拉里·哈尔夫(Larry Halff)与戴维·雷科尔顿(David Recordon)
会面讨论在Twitter和Ma.gnolia API上使用OpenID进行委托授权。他们讨论得出结论,认为没有完成API访问委托的开放标准。
2007年4月,成立了OAuth讨论组,这个由实现者组成的小组撰写了一个开放协议的提议草案。来自Google的德维特·克林顿(DeWitt Clinton)获悉OAuth项目后,
表示他有兴趣支持这个工作。2007年7月,团队起草了最初的规范。随后,Eran Hammer-Lahav加入团队并协调了许多OAuth的稿件,创建了更为正式的规范。
2007年10月, OAuth核心1.0最后的草案发布了。"
===============================华丽的分割线=====================================
我们先来看看Oauth这套网络开放协议是做什么的?用一个词语来概括就是:“授权”。
我在网上找了很多资料,我最喜欢的一个例子就是关于“豪车备用钥匙”这个例子:
如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间。是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题。
豪车一般配备两种钥匙:主钥匙和泊车钥匙。当你到酒店后,只需要将泊车钥匙交给服务生,停车的事情就由服务生去处理。与主钥匙相比,
这种泊车钥匙的使用功能是受限制的:它只能启动发动机并让车行驶一段有限的距离,可以锁车,但无法打开后备箱,无法使用车内其他设备。
这里就体现了一种简单的“开放授权”思想:通过一把泊车钥匙,车主便能将汽车的部分使用功能(如启动发动机、行驶一段有限的距离)授权给服务生。
(来自:http://blog.csdn.net/seccloud/article/details/8192707)
我们用一张图先来看一下正常我们应用请求服务器拿用户信息的过程:
资源是用户个人基础资料如:头像、用户名,身份证等等。总归就是通过授权可以拿到的信息;我们可以简单的理解为登录的过程就是授权的过程。
服务器授权你这个客户端可以拿到某个用户的个人资料。但这只局限于拿本网站,或者叫本项目的信息,如果用户想在本网站获取QQ的信息、微信的信息。
就需要到QQ、微信那边去授权,也就是说“登录”。 而这些第三方网站如何允许你去授权?就需要他们基于Oauth协议去实现授权。
(本文中所有讲的Oauth 都是Oauth2.0,因为1.0已经作废,我们完全可以不用去管它。 )
我们经常看到的第三方网站可以使用允许使用QQ登录、微信、微博登录都是实现Oauth2.0:
QQ:http://wiki.open.qq.com/wiki/mobile/OAuth2.0%E7%AE%80%E4%BB%8B
微信:http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3
微博:http://open.weibo.com/wiki/Oauth
我们以微博举引用一张流程图:
这样看有点迷糊,其实常规来说Oauth2.0 是三个步骤:
1,请求资源所有者(RO)获取授权码;
2,用授权码请求授权服务(AS)获得令牌(Token);
3,带Token请求资源服务(RS)获得资源;
我们抽象的画一下这个过程:
这里要区分开两件事:一个是我实现Oauth授权提供资源请求,一个是我根据Oauth协议请求别人的资源;
我们平时工作中多数是后者。所以我们的方向重点是想如何对接QQ、微信、微博。更确切的说我们大多时候开发项目
是想对接QQ、微信、微博这些平台帮我们实现使用第三方账户登录本平台。
(当然自身项目如果做到一定规模当然也是可以自己实现Oauth,提供授权登录给其他平台的)
=============================华丽的分割线==========================
我们以QQ举例对接QQ授权登录的七个步骤:
Step1. 申请获得appid与appkey
Step2. 界面放置QQ登录按钮
Step3. 获取Access Token
Step4. 通过Access Token获取用户的OpenID
Step5. 调用OpenAPI,来请求访问或修改用户授权的资源
如果仅仅以QQ号作为平台账户那上面五个步骤就够了,将OpenID写入系统记录,每次登录跳QQ就ok了。
如果不是则还需要以下两个步骤:
Step6. 将QQ信息与用户信息绑定
Step7. 未注册则隐式注册,即:要求用户绑定手机号并填写初始密码
我们根据这七步来画一个流程图已开发完毕的情况下,用户的第三方QQ好登录流程(这里就不详细写明所有参数,所有参数请上QQ开放平台浏览):
这就完成了一个对接QQ的Oauth2.0的工作,其实这里我本来想把所有参数都加上然后画一个所有请求的的流程图。
但是想来不怎么好画。所以就画了个最简单的界面流程图,这算是个偷懒的行为,在下一篇关于Winner框架SSO单点登录系统中我再做详细描述吧!
本章中详细的参数还是看QQ官网吧:http://wiki.open.qq.com/wiki/mobile/OpenAPI%E8%B0%83%E7%94%A8%E8%AF%B4%E6%98%8E
总的来说,QQ,微信、微博基本都是这种流程详细的参数官网都很详细。
(提供Oauth2.0授权的网站很多,其中GitHub也有提供,所以我看到很多网站也可以使用GitHub账号登录。)
======================华丽的分割线==================
最后,修正一下上面有个观点,我说:“一个是我实现Oauth授权提供资源请求,一个是我根据Oauth协议请求别人的资源,大部分的时候我们的工作是后者。”
这里有一点细节要再详细说明一下,后者是我们根据Oauth协议请求别人的资源比如QQ这种,但是前者不完全是提供资源给第三方“外部”项目。
我们完全可以把登录系统做成基于Oauth协议实现的,但是我们没有开放给“外部”第三方调用,而是给自己的“内部”项目调用。
比如:SSO+APP应用。SSO基于Oauth实现了授权协议,而APP想要登录,或者请求服务端接口就一些敏感信息时就必须经由登录获取授权,得到Token令牌。
再带着token令牌获取需要的信息资源。 只是说我们没有对给第三方开放,但是我们还是基于Oauth标准来实现的。所以修正一下,多数时候是根据Oauth协议请求别人的资源
但更多时候我们是基于Oauth协议实现授权给我们项目里的Client调用,少数时候我们需要对外开放。
这一章其实没有把Oauth讲的很深,我这里引用一篇博客:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html。这篇博客就讲的很细致,对于Oauth授权细分情况下的几种模式都讲的很到位。
因为下一篇能要讲Winner2.0框架中的SSO单点登录系统,所以讲把Oauth单独拿出来写一篇偏基础的博客,下一章的SSO我会更细致的描述我们对接QQ或者微信的流程、代码以及参数等等。
好了,就写到这里。有兴趣一起探讨Winner框架的可以加我们QQ群:261083244。或者扫描左侧二维码加群。