文档章节

OAuth2.0(一)—— OAuth2.0的用途

eyesfour
 eyesfour
发布于 2016/03/18 15:18
字数 2257
阅读 201
收藏 2
点赞 1
评论 0

简单的背景说明

  所谓OAuth2.0就是OAuth这个授权框架的2.0版本,至于1.0已经废弃不用了。

  本系列主要讨论OAuth2.0的概念、优缺点、用途以及其使用方法。主要的参考资料是RFC 6749

OAuth2.0的Logo

  如果在此之前你对OAuth2.0知之甚少的话,建议可先尝试一下看看本文,再去读标准文档。我本人在学习OAuth2.0时就有过一段痛苦的经历,在开始学习OAuth2.0这个框架时,我对OAuth一无所知,然后一上来就开始读英文版的RFC标准,结果被里面一大堆初次接触的名词术语搞得晕头转向。幸亏有伟大的互联网帮助,读了一些开源代码再结合前辈们的博文,才把它搞清楚。

  如果你已经非常了解OAuth2.0所解决的痛点,那么可以跳过本章,因为对于对OAuth2.0已经有所了解的朋友来说,本章会显得十分啰嗦。

  现在各大网站,如微信、微博、淘宝等,都纷纷使用符合OAuth2.0标准的授权机制,如果我们开发的产品与这些软件有交集的话,那么在简单地使用这些公司提供的SDK来开发OAuth2.0的客户端之前,深入地了解一下OAuth2.0,还是很有必要的。

OAuth2.0是用来干什么的

  有必要先来了解一下OAuth2.0的用途。

  简单地用一句话概括,OAuth2.0是用来给客户端授权的,比如让客户端登录到系统中获得资源。

  在一个典型的客户端/服务端(C/S)模型中,客户端需要登录服务端来获取它所需要的资源,比如QQ客户端,它需要先登录到腾讯的服务器后,才能得到好友列表,才能和好友聊天。但如果仅仅是为了登录的话,其实使用OAuth2.0是没有必要的。

  OAuth2.0解决了两个问题:

  1. 单点登录。 象QQ这种既有客户端,又有网页,并且还有其它衍生的业务如QQ空间、腾讯微博、腾讯邮箱等这样的产品,如果每个业务都有一个单独的认证系统,那么要么是用户需要为每个业务记忆一个账号密码,要么后台为了使各个业务能用同一个账号密码登录而需要不停地同步账号信息。使用OAuth2.0时,只需要在授权服务上保存用户信息,其它业务服务不需要保留用户信息。如何实现?后面会展开讨论。当然,单点登录并非OAuth2.0所要解决的主要问题,可替代的方案还是较多的。
  2. 第三方授权的安全问题。 OAuth2.0可以让第三方应用在得到授权时,不需要知道用户的账号密码。比如你需要开发一个产品,在这个产品中,需要具有微信分享功能,可以将一些内容分享给自己的微信好友。在分享之前,当然首先需要使用用户的微信账号登录,那么问题来了,用户在你的应用中输入他的微信账号与密码,你分秒就可以通过你的应用盗用他的账号,而一旦他的账号被盗用,他账号下的所有资源都将全部暴露,而盗用者只要修改了密码,以及手机邮箱等其它信息,用户将永远找不回这个账号。这是OAuth2.0所要解决的主要问题,如何解决?继续卖个关子,后面讨论。

  另外,在实践过程中,我还发现使用OAuth2.0所带来的意外红利,比如说WEB网站前后端分离时鉴权可以更便利,以及解决使用cookie所带来的由于本地信息被泄露所导致的账号被盗问题。这些将单独写一章来讨论。

  当然,OAuth2.0并不能解决所有问题,它只不过在安全性、开放性、便利性中找到了一个较佳的平衡点,老生常谈的“凡事有利必有弊”这句话在这里同样适用。关于这一点,也将在后面展开讨论。

先来讲个故事

  在讲OAuth2.0那些流程、名词、术语前,先来讲个故事吧。

  请看上面这张图,左边这部分是客户端/服务端模型,右边这部分是张三与银行。客户端从服务端获取资源的过程,可以类比于张三从银行取钱的过程,这里银行是服务端,张三是客户端,银行卡是账号,密码是记在张三脑子里的银行卡密码。在简单的应用中,这样的关系已经足够了,张三需要用钱的时候,拿着卡跑到银行中取钱,然后再去付钱买东西。

  这样的模型在某些情况下并不方便,请看下面这张图:

  当张三在三个银行都有账号时,他需要持有三张银行卡,分别记住每张银行卡的密码。当然你可以为这些银行卡都设置相同的密码,但卡号总不能相同吧,结果,张三不得不在皮夹里塞上三张卡。随着张三的银行卡越来越多,皮夹也越来越满,终于有一天,张三不乐意了,强烈要求这些银行能只用一张卡,就可以在各个银行中存钱取钱,以及在餐厅超市中刷卡消费,同时李四、王五等等也纷纷响应。经过漫长卓越的努力,银行的大佬们终于决定坐在一起讨论如何来解决这个问题了。又过了几十年,终于有了一卡通。这下,张三只需要带一张卡啦。

  然而,这仅仅也只是实现了用一个账号,在多个业务中登录的功能。而且请注意,张三虽然只需要带一张卡,但是在每次取钱或消费时,还是必须刷卡并输入密码。有没有办法不用每次都刷卡输密码呢?有!

  有一天,万能的马云大神给张三带来了支付宝。

  

  从此以后,张三吃快餐、买奶粉再也不用刷卡输密码了,只要亮一下二维码。

  觉得不安全了是吧。张三也是这么认为的,万一手机丢了怎么办?万一二维码给人家拍走了怎么办?OAuth2.0也有同样类似的问题,并有相应的解决方案或说法,后面会专门讨论。前面我也提到过,OAuth2.0只是在安全性、开放性、便利性中找到了一个较佳的平衡点,没有一个方案是万能的。如果要安全,那最好是在超市刷卡输密码付钱时,还必须插个U盾,这显然不会是我们要的东西。

  好了,至此,生活已经变得很美好了。然而生命不息,奋斗不止。到目前为止,我们看到,不管是用多张卡还是用一张卡,不管是用卡还是用二维码,使用的主体都是张三他自己,没有其它人。

  现在,张三的儿子要上大学了,每个月需要生活费。张三当然不能把自己的卡直接交给儿子去用,即便是高中里再乖的孩子,到了大学也难保不学会乱花钱不是?于是通常的做法是张三到银行给儿子办一张卡,然后每个月从自己的账户里打钱过去。看上去这也挺好。但是这样一来,张三他们花了几十年才得到的一卡通便利又没了,张三又得在两张卡上开始折腾,然后张三的女儿也要上大学了......

  好在银行还有一个叫做副卡的东西,张三在自己的账户下申请了一张副卡,然后设定其每月的限额,交给儿子去用。儿子拿了这张卡,绑定到自己的支付宝上。女儿上大学后也是这么做。

  于是张三所要操心的就只是赚更多的钱了。

  故事到这里就该结束了,在后面的章节中我会将这个故事与OAuth2.0结合起来描述,OAuth2.0大抵就是处理了这类问题。但是这个故事应该还会延续,因为OAuth2.0并不完美,后面还有很多路要走,我们拭目以待。

本文转载自:http://www.howact.com/2016/03/16/OAuth2-0_1/

共有 人打赏支持
eyesfour

eyesfour

粉丝 8
博文 2
码字总数 132
作品 1
杭州
技术主管
单点登录实现

单点登录实现——基于OAuth2.0协议的接入方案 OAuth是目前广泛应用的开放接入标准,与OAuth1.0相比,OAuth2.0实现起来更加。OAuth的相关原理在互联网上有大量的资料可以查阅。以下是通过OAu...

Gtwo ⋅ 2016/07/22 ⋅ 0

Oauth2.0与Oauth1.0的区别

1.Oauth2.0授权步骤:(通俗版) 先引导用户到授权服务器请求用户授权,获取授权码(Authorization Code),客户端通过授权码到授权服务器换取访问令牌(access token),用访问令牌去获取资...

hanzhankang ⋅ 2014/02/10 ⋅ 0

【OAuth2学习之路】Spring Security OAuth官网文档翻译

现将开发文档翻译出来,因为看英文实在是比较吃力的。 首先看下官方的指南Developers Guide,OAuth的两个版都都有。本文看的是OAuth2的开发指南。 翻译如下: Spring Security OAuth2开发指南...

666B ⋅ 2014/09/09 ⋅ 0

android开发之第三方集成之OAUTH教程篇

微博作为新兴的一项网络工具,在某种意义上讲实现了把世界变小的作用。足不出户,也变成了现实。作为程序员我们更加关注的是为我所用。幸好的是微博运行商为我们提供了丰富的接口,我们可以善...

长平狐 ⋅ 2012/08/14 ⋅ 0

android开发之第三方集成之OAUTH教程篇

微博作为新兴的一项网络工具,在某种意义上讲实现了把世界变小的作用。足不出户,也变成了现实。作为程序员我们更加关注的是为我所用。幸好的是微博运行商为我们提供了丰富的接口,我们可以善...

长平狐 ⋅ 2012/08/21 ⋅ 0

android开发之第三方集成之OAUTH教程篇

微博作为新兴的一项网络工具,在某种意义上讲实现了把世界变小的作用。足不出户,也变成了现实。作为程序员我们更加关注的是为我所用。幸好的是微博运行商为我们提供了丰富的接口,我们可以善...

长平狐 ⋅ 2012/08/09 ⋅ 0

CAS3.5.x(x>1)支持OAuth2 server

OAuth support CAS3.5.x提供了oauth的支持,包括客户端和服务端,cas-server-support-oauth依赖架包 scribe-1.3.5.jar scribe-up-1.2.0.jar jackson-core-2.3.0.jar,jackson-databind-2.3.0......

Zuo_W ⋅ 2014/02/16 ⋅ 6

OAuth 及 移动端鉴权调研

OAuth OAuth是一个解决用户无需向第三方应用提供用户名密码,让第三方应用访问用户私密资源的授权方案。 举例: 用户a,在网站B存有私密信息(年龄、邮箱、头像),而a在访问第三方网站C时,为...

马肱 ⋅ 05/15 ⋅ 0

OAuth 2.0协议

为什么出现OAuth2.0? oauth1.0对手机客户端,移动设备等非server第三方的支持不好。其实oauth1.0也是可以支持手机客户端等移动设备的,也有相应的流程。但是oauth1.0是将多种流程合并成了一...

柳哥 ⋅ 2015/08/05 ⋅ 0

开放平台_OAuth2.0

为什么出现oauth2.0 1 oauth1.0对手机客户端,移动设备等非server第三方的支持不好。其实oauth1.0也是可以支持手机客户端,移动设备等,也有相应的流程。但是oauth1.0是将多种流程合并成了一...

王二狗子11 ⋅ 01/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部