《理解 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 这套网络开放协议是做什么的?用一个词语来概括就是:"授权"。
我在网上找了很多资料,我最喜欢的一个例子就是关于 "豪车备用钥匙" 这个例子:
如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间。是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题。
豪车一般配备两种钥匙:主钥匙和泊车钥匙。当你到酒店后,只需要将泊车钥匙交给服务生,停车的事情就由服务生去处理。与主钥匙相比,
这种泊车钥匙的使用功能是受限制的:它只能启动发动机并让车行驶一段有限的距离,可以锁车,但无法打开后备箱,无法使用车内其他设备。
这里就体现了一种简单的 "开放授权" 思想:通过一把泊车钥匙,车主便能将汽车的部分使用功能(如启动发动机、行驶一段有限的距离)授权给服务生。
我们用一张图先来看一下正常我们应用请求服务器拿用户信息的过程:
资源是用户个人基础资料如:头像、用户名,身份证等等。总归就是通过授权可以拿到的信息;我们可以简单的理解为登录的过程就是授权的过程。
服务器授权你这个客户端可以拿到某个用户的个人资料。但这只局限于拿本网站,或者叫本项目的信息,如果用户想在本网站获取 QQ 的信息、微信的信息。
就需要到 QQ、微信那边去授权,也就是说 "登录"。 而这些第三方网站如何允许你去授权?就需要他们基于 Oauth 协议去实现授权。
(本文中所有讲的 Oauth 都是 Oauth2.0,因为 1.0 已经作废,我们完全可以不用去管它。 )
我们经常看到的第三方网站可以使用允许使用 QQ 登录、微信、微博登录都是实现 Oauth2.0:
QQ: http://wiki.open.qq.com/wiki/mobile/OAuth2.0简介
微信: http://qydev.weixin.qq.com/wiki/index.php?title=OAuth验证接口
微博: 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调用说明
总的来说,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。或者扫描左侧二维码加群。
来源: http://www.cnblogs.com/demon28/p/8036873.html