程序员的自我救赎---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支付中心 (七)权限系统 (八) ...
随机推荐
- 老大哥在看着你!我国部署超2000万个AI监控系统
原文:Big brother is watching you! China installs 'the world's most advanced video surveillance system' ...
- Internal类
C#中一个类中的成员有四种修饰级别: public:完全开放,谁都能访问. private:完全封闭,只有类自身可以访问. internal:只对相同程序集,或使用InternalVisibleToA ...
- 最长公共子序列Lcs(打印路径)
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...
- AngularJS学习篇(十二)
AngularJS SQL ASP.NET 中执行 SQL 获取数据 <!DOCTYPE html> <html> <head> <meta charset= ...
- ACID 数据库正确执行四要素
ACID:数据库事务正确执行所必须满足的四个基本要素的缩写: 原子性(atomicity,或叫不可分割性),一致性(consistency),隔离性(isolation,又称独立性),持久性(dura ...
- JavaScript面向对象(收集整理)
(1)封装 首先理解构造函数:所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上. f ...
- asp.net web api客户端调用
服务接口 接口1: //Post:http://127.0.0.1/HY_WebApi/api/V2/Key/FunctionTest1 [HttpPost] public HttpResponseM ...
- [转载] Kafka+Storm+HDFS整合实践
转载自http://www.tuicool.com/articles/NzyqAn 在基于Hadoop平台的很多应用场景中,我们需要对数据进行离线和实时分析,离线分析可以很容易地借助于Hive来实现统 ...
- 【转】jQuery代码片段备用
在CSDN看到的,记下备用.原文:http://www.csdn.net/article/2013-07-16/2816238-15-jquery-code-snippets-for-develope ...
- 关于iOS GangSDK的使用,为App快速集成社群公会模块
手上有一个自己开发的小游戏,想加一个家族系统活跃下游戏的氛围,想到这块儿可能会有大量的工作需要自己做,就偷了个懒去网上搜罗了一波,结果惊奇的发现居然真的有类似的服务,并且还是免费的,所以决定入坑尝试一 ...