程序员的自我救赎---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号作为平台账户那上面五个步骤就够了,将QQ号写入系统记录,每次登录跳QQ就ok了。
如果不是则还需要以下两个步骤:
Step6. 将QQ信息与用户信息绑定
Step7. 未注册则隐式注册,即:要求用户绑定手机号并填写初始密码
我们根据这七步来画一个流程图已开发完毕的情况下,用户的第三方QQ好登录流程(这里就不详细写明所有参数,所有参数请上QQ开放平台浏览):

差不多,这就完成了一个对接QQ的Oauth2.0的工作,其实这里我本来想把所有参数都加上然后画一个所有请求的的流程图。
但是想来不怎么好画。所以就画了个最简单的界面流程图,这算是个偷懒的行为吧。 总的来说,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单独拿出来写一篇偏基础的博客,其实更深入的细分我也没有全部吃透,大体流程其实都差不多。
好了,差不多就讲到这里。有兴趣一起探讨Winner框架的可以加我们QQ群:261083244。或者扫描左侧二维码加群。
程序员的自我救赎---3.1:理解Oauth2.0的更多相关文章
- 程序员的自我救赎---3.2:SSO及应用案例
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 程序员的自我救赎---1.4.2: 核心框架讲解(BLL&Tool)
<前言> <目录> (一) Winner2.0 框架基础分析 (二) 短信中心 (三)SSO单点登录 (四)PLSQL报表系统 (五)钱包系统 (六)GPU支付中心 (七)权限 ...
- 程序员的自我救赎---11.3:WinService服务
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 程序员的自我救赎---11.4:FileSystem文件服务
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 程序员的自我救赎---12.2.3: 虚拟币交易平台(区块链) 下 【C#与以太坊通讯】
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 程序员的自我救赎---11.1:RPC接口使用规范
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 程序员的自我救赎---1.4.1:核心框架讲解(DAL)
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 程序员的自我救赎---1.4.3: 核心框架讲解(MVC)
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 程序员的自我救赎---10.1:APP版本控制系统
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
随机推荐
- 暑假练习赛 007 E - Pairs
E - Pairs Description standard input/outputStatements In the secret book of ACM, it’s said: “Glory f ...
- js 添加事件 attachEvent 和 addEventListener 的区别
1.addEventListener 适用w3c标准方法addEventListener绑定事件,如下,事件的执行顺序和绑定顺序一致,执行顺序为method1->method2->meth ...
- iPad web APP 开发相关
1.移除 browser chrome,全屏启动 <meta name="apple-mobile-web-app-capable" content="yes&q ...
- 30个CSS3选择器的应用
或许大家平时总是在用的选择器都是: id class 以及标签选择器.可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选 或许大家平时总是在用的选择器都是:#id .class ...
- Netty——简单创建服务器、客户端通讯
Netty 是一个基于NIO的客户.服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用.Netty相当简化和流线化了网络应用的编程开发过程 ...
- MQTT——发布报文
发布报文的知识点并不难,只是多.看过前面几章的读者们应该或多或少都认识服务质量QOS.发布报文跟他的联系最紧的.我们也清楚订阅报文里面虽然也有用到QOS,但是他却没有更进一步的联系.往下看就知道是什么 ...
- Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0,"解决办法
这是因为先安装了 .NET Framework 4,随后启用了 .NET Framework 3.5 WCF HTTP 激活,则会发生此错误. 只需要已管理员用户在cmd中运行aspnet_regii ...
- JavaScript系列-----对象基于哈希存储(<Key,Value>之Key篇) (1)
1.Hash表的结构 首先,允许我们花一点时间来简单介绍hash表. 1.什么是hash表 hash表是一种二维结构,管理着一对对<Key,Value>这样的键值对,Hash表的结构如下图 ...
- JavaScript 经典之一 闭包
作为一个前端开发者,闭包是必须要攻克掉的障碍.据说好多面试者挂在闭包面试上.下面我就给大家讲一下我理解中的闭包.不说太多的废话,直接进入主题. 变量作用域 学习编程语言需要明白,变量的作用域.变量作用 ...
- MVC页面静态化
MVC 页面静态化 最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...