假设有两家互联网企业 A 和 B,其中 B 是一家提供相片云存储的公司。即 B 的用户可以把相片上传到 B 网站上长期保存,然后可以在不同的设备上查看。某一天,A 和 B 谈成了一项合作:希望 B 用户在使用 A 的客户端时,也可以观看他在 B 的相片。假设你是技术负责人,需要出一个实现方案,怎么做?

  要不让 B 提供一个接口:

  http://xxx.xxx.com/getPhoto?account=

  参数:

    account : B 账号

  返回:

    指定账号下的所有相片

  有了这个接口,A 的客户端只需在界面上显示一个输入框,让用户输入他的 B 账号,然后调用这个接口来获取相片就可以了。

  这样可行吗?

  NO!为啥?

  因为实现并开放这样一个接口,相当于直接把 B 公司的相片资源全部暴露在互联网中,虽然并没有公开,但是对于有点安全意识的技术人员来说,要发现这个接口简直轻而易举。这样的话,B 的用户就没有任何隐私了。

  那怎么办呢?这样吧,为了保证不能随便获取别人的相片,我们把接口改成这样:

  http://xxx.xxx.com/getPhoto?account=&pwd=

  除了要求用户输入账号,还要输入密码。只有当账号密码验证通过,才返回该账号下的所有相片。这样,即使黑客发现了这个接口,他不知道用户的密码,所以没办法窃取用户的相片了。这样 OK 了吧?

  可能对于很多从没有接触过 Oauth 协议的人来说,这样说就已经没什么问题了。但是,实际上答案还是 NO!绝不可以这么做!

  为什么?这里涉及到一个信任问题。如果这样实现,那么,用户必须在 A 的软件里输入他在 B 的账号和密码。如果你是一个隐私意识很强的人,你很可能会问:“凭什么我要把 B 的账号密码告诉 A ?”这里,从用户的角度就已经感受到一种不安全感,凭什么让我信任你 A,你保证不拿我的 B 账号密码去干坏事?而更深一层次,站在 B 的角度来考虑的话,也是一样的问题:我凭什么绝对信任 A?如果 A 在接收到用户的输入之后,马上就把请求发到我们这里来,那是 ok 的。但是万一 A 在这个过程偷偷把账号密码存起来了呢?那随着时间的推移,A 就慢慢地搜集到一大批 B 的账号密码!这对 B 来讲,是不能接受的!

  那怎么办呢?

  我们分析一下这个问题产生的原因,主要是在于 A、B、用户 三方的交互模型有问题。请看:

  在这个场景下,用户需要访问他在 B 的相片资源,但是他不能直接和 B 打交道,而是必须通过 A。在这个前提下去考虑问题,无论如何无法想出一个既能实现功能,又能让用户和 B 都感到放心的实现方案。

  Oauth2.0 就是为了解决这个问题而提出来的交互模型。它告诉人们,在这种场景下,三方要怎么打交道,才能做到安全、合理。

  具体来说,Oauth2.0 的交互模型的核心是这个样子的:

  解释一下这几个术语。

  资源拥有者即用户。

  客户端,泛指所有需要访问资源的软件实体。在我们上面举的例子中,资源即 B 用户的相片。A 要访问 B 用户的相片,那么 A 就是一个客户端。

  资源服务器。即资源的存放地点,或者说资源的访问入口。在例子中,资源服务器即 getPhoto 接口所部署的服务器。客户端必须经由这里去访问资源。

  鉴权服务器。这是一个对用户的身份进行认证、并对客户端进行授权的地方。这也是在我们的例子中所没有的一个节点。通常情况下,鉴权服务器也是属于 B 公司的。

  好,接下来看看整个交互过程是怎样的。

  首先,同样是 B 的用户在使用 A 的软件,然后,A 需要访问 B 用户的相片。这个时候,A 并不是展示一个输入框给用户,而是打开一个页面。这个页面就是 B 部署在鉴权服务器上面的一个鉴权页面,通常情况下,它长得类似下面这个样子:

  上面这个是腾讯给有道云笔记进行授权的页面。(是不是很熟悉?在哪见过?有兴趣了解一下账号接出的原理,其实就是Oauth2.0。)

  这个页面有两个要素:

  1,有认证机制。在腾讯这个例子中,你需要输入QQ账号密码,证明你是一个合法的QQ用户

  2,展示了授权信息。看页面右方“有道云笔记将获得以下权限”部分。这是在告诉用户,如果你授权给客户端,那么,客户端将获得访问你这些资源的权限

  注意,这个页面是部署在 B 的鉴权服务器上,所有用户输入的账号密码是直接提交给 B,A 是没有任何机会拿到的。

  如果用户同意授权并且认证通过,那么,接下来鉴权服务器会通知 A,并给 A 发送一个访问令牌(access token)。有了这个访问令牌,A 就可以拿着它去找 资源服务器要资源了。

  所以,获取相片的接口会是这个形式:

  http://xxx.xxx.com/getPhoto?accesstoken=

  资源服务器在接收到这个请求之后,会拿着 access token,再去找鉴权服务器,检查这个 access token 的合法性和权限,如果通过的话,才返回资源给客户端。

Oauth2.0(一):为什么需要 Oauth2.0 协议?的更多相关文章

  1. Web 协议 HTTP1.0 HTTP1.1 SPDY HTTP2.0

    Web 协议 HTTP1.0 HTTP1.1 SPDY HTTP2.0 HTTP1.0 VS HTTP1.1 长连接HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而H ...

  2. USB 3.0规范中译本 第8章 协议层

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 协议层管理设备及其主机之间端到端的数据流.这一层建立在链路层提供对某些类型的包的保证传输(guarantee ...

  3. Navicat Premium 12.0.29 / 12.1.5.0安装与激活

    转自:https://www.jianshu.com/p/5f693b4c9468 本文介绍Navicat Premium 12.0.29和Navicat Premium 12.1.5.0的安装.激活 ...

  4. 转 如何诊断和解决high version count 10.2.0.4 and 11.2.0.4

    转自 http://blog.csdn.net/notbaron/article/details/50927492 在Oracle 10g以上的版本,High version count可谓是一个臭名 ...

  5. 10.2.0.4 to 10.2.0.5 Installation of Patch Set Release (Windows)

    环境:10.2.0.4集群数据库zlm10g(双节点,zlm10g1,zlm10g2) 系统:Windows 2003 Server 64Bit 内存:2G RAM 存储:ASM 目标:把集群数据库从 ...

  6. MySQL与MariaDB核心特性比较详细版v1.0(覆盖mysql 8.0/mariadb 10.3,包括优化、功能及维护)

    注:本文严禁任何形式的转载,原文使用word编写,为了大家阅读方便,提供pdf版下载. MySQL与MariaDB主要特性比较详细版v1.0(不含HA).pdf 链接:https://pan.baid ...

  7. PHP build notes - WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 3.0, min: 204, excluded: 3.0).

     WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 3.0, ...

  8. CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14

    准备篇: CentOS 7.0系统安装配置图解教程 http://www.osyunwei.com/archives/7829.html 一.配置防火墙,开启80端口.3306端口 CentOS 7. ...

  9. centos 7.0 编译安装php 7.0.3

    php下载页面 http://cn2.php.net/downloads.php 7.0.3多地区下载页面 http://cn2.php.net/get/php-7.0.3.tar.gz/from/a ...

  10. ASP.NET 5 已死 - 隆重介绍 ASP.NET Core 1.0 和 .NET Core 1.0

    还没正式登场就死了?不能怪我标题党,是大神Scott在他博客上这么说的,我只是翻译了一下. 在1月20号最新的ASP.NET Community Standup视频中,微软aspnet开发组的大帅哥 ...

随机推荐

  1. JavaScript: The Good Parts

    Chapter 1 Good Parts: JavaScript is an important language because it is the language of the web brow ...

  2. Python 匿名参数

    #-*- coding:utf-8 -*- #匿名函数 #匿名函数语法格式 ''' 变量 = lambda 参数列表:表达式 ''' func = lambda x,y:x+y a = func(2, ...

  3. 关于Unity中的NGUI精灵

    NGUI精灵实例 1.创建Unity项目工程和文件目录,保存场景 2.创建一个精灵NGUI---->Create---->Sprite,发现它的UI Sprite组件的贴图属性只支持Atl ...

  4. ImageMagick安装

    图片处理是大多数电子商务系统必须用到的组件,下面介绍ImageMagick的安装! 一.软件列表ImageMagick-6.7.1-0.tar.gzJMagick-6.4.0-0.tar.gzjpeg ...

  5. VIM命令行模式下的相关知识

    当按下:键时, Vim会切换到命令行模式: 重复上次执行的EX命令,只需按@:就可以: 在一行或多个连续行执行命令 很多的EX全天候可以指定操作范围,如行号,位置标记等: 以:print命令作为演示, ...

  6. 求 pi 的近似值题型汇总

    (注:暂时先记录这些问题,后期会持续更新) 一.用格雷戈里公式计算π的近似值,精度要求:最后一项的绝对值小于0.00001 1,用while循环实现 int denominator,flag; dou ...

  7. Spring Boot Controller相应JSP页面 错误whitelabel error page

    在学习SpringBoot显示JSP页面的时候出现了错误,Controller可以正常调用,但是JSP页面就是不能正常显示. whitelabel error page 解决:注释掉scope < ...

  8. (原)关于sdl在部分机器上做视频显示,改变显示窗口大小会崩溃

    今天测试人员反应,之前做的视频绘图显示,会在她机器上,会出现崩溃现象,最后我在她机器上对代码进行跟踪,发现在某种情况,确实会崩溃. 最主要的原因是,视频显示窗口变成非活动窗口的时候,sdl内部会循环消 ...

  9. (实用)Ubuntu Linux静态IP网络配置

    记录备忘. 基于Ubuntu 14.04 LTS Server. 首先查看一下当前系统的网卡: $ sudo iconfig 比如这里我除了回环网路lo外,网络接口名为em1,下面就去给它配置网络. ...

  10. JS 在火狐浏览器下关闭弹窗

    1.首先,要确定火狐设置是否允许通过JS代码window.close()方法关闭标签. 确定方式如下:      在Firefox地址栏里输入 about:config    在配置列表中找到dom. ...