oauth2.0–基础–01–理论


1、快递员问题


1.1、问题描述

我经常点外卖,每天都有外卖员来送餐。我必须找到一个办法,让快递员通过门禁系统,进入小区。
如果我把自己的密码,告诉快递员,他就拥有了与我同样的权限,就可以自由的出入小区,这对小区的安全造成影响。
你可以会想,每次收到外卖就改一次密码,这样就可以让外卖员拥有进入小区的权力,但是这很麻烦,因为第一,我要自己去修改密码,第二,我还得把最新的密码通知我的家人和朋友。那么有没有办法,既可以让外卖人员自由进入小区,而又不必修改密码呢。比如说一个临时凭证

1.2、需求描述

  1. 每次外卖人员来送餐,我希望给外卖人员一个凭证,而非密码。
  2. 凭证需要有个过期时间,防止外卖人员一直持有这个凭证。
  3. 凭证只能到A栋楼2层201房间门口,不能去其他楼,同时也不能去A栋楼的其他楼层。

1.3、设计凭证

  1. 门禁系统的密码输入器下面,增加一个按钮,叫做"获取授权"。快递员去申请授权。

  2. 申请前,我和快递员做了一个约定,每次申请的时候,需要把快递员工号发给我,同时我这里记录下这个工号。

  3. 他按下按钮以后,屋主(也就是我)的手机就会跳出对话框,有人正在要求授权。系统还会显示该快递员的姓名、工号和所属的快递公司。我拿出我记录的工号和系统的工号对比,只有相等,我才认为这个快递员是我授权的。

  4. 我确认请求属实,就点击按钮,告诉门禁系统,我同意给予他进入小区的授权。

  5. 门禁系统得到我的确认以后,向快递员显示一个进入小区的令牌(access token)。只在短期内(比如七天)有效。且只能去我所在的那层楼。

  6. 快递员向门禁系统输入令牌,进入小区。

2、oauth2.0是为了解决什么样的问题

2.1、场景

我们经常遇到这种情况,假设有个网址W1,可以将用户储存在W2的照片,冲印出来,用户U1使用该功能,必须让W1读取自己储存在W2上的照片,这个时候应该怎么办呢?

2.2、传统的做法:

将W2的账号密码告诉W1,但是这样做有以下缺陷

1. W1可能保存W2的账号密码,不安全
2. W1拥有了获取用户储存在W2所有资料的权力,用户没法限制W1获得授权的范围和有效期。
3. 用户只有修改密码,才能收回赋予W1的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
4. 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的其他第三方数据泄漏。

2.3、现在的做法

使用oauth2.0 来解决上面的问题。

3、专用名词

3.1、授权过程名词

  1. client:第三方应用程序或者客户端,即W1
  2. HTTP service: 服务提供商,即W2
  3. Resource Owner:资源所有者,即U1
  4. User Agent:用户代理,本文中就是指浏览器。
  5. Authorization server:认证服务器
    1. 服务提供商处理认证的服务器。
  6. Resource server:资源服务器
    1. 服务提供商存放资源的服务器
    2. 一般它与认证服务器分开
  7. clinet Identifier:客户端标识符,即W1向W2申请的clinet Id
  8. redicrection ulr:重定向的url
  9. user authenticates:用戶 确定 授权
  10. authorization code:授权码
  11. access token:访问令牌
  12. optional refresh token:可选的刷新令牌

3.2、授权认证参数说明

  1. code:授权码

    1. 授权码。
    2. 有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。
    3. code与客户端ID和重定向URI,是一一对应关系。
  2. state:户端的当前状态
    1. 如果客户端的请求中包含这个参数,认证服务器的回应也必须包含这个参数。
  3. response_type:授权类型,具体看服务器定义
  4. client_id:客户端的ID
  5. redirect_uri:表示重定向URI
  6. scope:申请的权限范围
  7. grant_type:使用的授权模式
  8. access_token:访问令牌
  9. token_type:令牌类型,大小写不敏感,可以是bearer类型或mac类型。
  10. expires_in:过期时间,单位为秒。
  11. refresh_token:更新令牌,用来获取下一次的访问令牌。
  12. scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
  13. password:密码
  14. username:用户名
  15. granttype:授权类型,具体看服务器定义
  16. refresh_token:更新令牌

4、授权模式

  1. 授权码模式:authorization code
  2. 简化模式: implicit
  3. 密码模式: resource owner password credentials
  4. 客户端模式: client credentials

4.1、 授权码模式:authorization code

功能最完整、流程最严密的授权模式。

步骤如下

(A) 用户访问客户端,客户端将用户导向认证服务器。
(B) 用户选择是否给予客户端授权。
(C) 假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(D) 客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。在客户端的后台的服务器上完成的,对用户不可见。
(E) 认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

A步骤中,客户端申请认证的URI,包含以下参数

GET /authorize?response_type=code&client_id=1111&state=2222&redirect_uri=https://www.baidu.com
  1. response_type=code:授权类型,这里表示授权码模式
  2. client_id:客户端id为1111
  3. 客户端状态:2222
  4. redirect_uri:重定向地址为https://www.baidu.com

C步骤中,服务器回应客户端的URI,包含以下参数:

https://www.baidu.com?code=xxxxx&state=2222
  1. code:授权码
  2. https://www.baidu.com:重定向地址

D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:

...?grant_type=authorization_code&code=xxxxx&redirect_uri=https://www.baidu.com&clientId=1111
  1. grant_type:表示使用的授权模式

E步骤中,认证服务器发送的HTTP回复,包含以下参数:

{"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA","example_parameter":"example_value"}
  1. access_token:访问令牌
  2. token_type:令牌类型,大小写不敏感,可以是bearer类型或mac类型。
  3. expires_in:过期时间,单位为秒。
  4. refresh_token:更新令牌,用来获取下一次的访问令牌。
  5. scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

4.2、简化模式

  1. 不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤。
  2. 所有步骤在浏览器中完成,令牌对访问者是可见的
  3. 客户端不需要认证。

步骤如下

(A)  客户端将用户导向认证服务器。
(B) 用户决定是否给于客户端授权。
(C) 假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。
(D) 浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
(E) 资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
(F) 浏览器执行上一步获得的脚本,提取出令牌。
(G) 浏览器将令牌发给客户端。

A步骤中,客户端发出的HTTP请求,包含以下参数:

GET /authorize?response_type=token&client_id=1111&state=2222&redirect_uri=https://www.baidu.com

C步骤中,认证服务器回应客户端的URI,包含以下参数:

....#access_token=2YotnFZFEjr1zCsicMWpAA&state=2222&token_type=example&expires_in=3600
  1. 参数前面是#

4.3、密码模式

  1. 用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
  2. 通常用在用户对客户端高度信任的情况下,才能考虑使用这种模式。
  3. 使用场景:微服务集群中单点登陆问题

步骤如下


(A) 用户向客户端提供用户名和密码。
(B) 客户端将用户名和密码发给认证服务器,向后者请求令牌。
(C) 认证服务器确认无误后,向客户端提供访问令牌。

B步骤中,客户端发出的HTTP请求,包含以下参数

POST /grant_type=password&username=1&password=2
  1. grant_type:授权类型,此处的值固定为"password",必选项。
  2. username:用户名,必选项。
  3. password:用户的密码,必选项。
  4. scope:权限范围,可选项。

C步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

{"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA","example_parameter":"example_value"}

4.4、客户端模式

  1. 以客户端的名义,向"服务提供商"进行认证。
  2. 严格地说,客户端模式并不属于OAuth框架所要解决的问题。
  3. 用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

步骤如下


(A) 客户端向认证服务器进行身份认证,并要求一个访问令牌。
(B) 认证服务器确认无误后,向客户端提供访问令

A步骤中,客户端发出的HTTP请求,包含以下参数:


....?grant_type=client_credentials
  1. granttype:授权类型,此处的值固定为"clientcredentials",必选项。
  2. scope:权限范围,可选项。

B步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

 {"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"example_parameter":"example_value"}

5、更新令牌

  1. 如果用户访问的时候,客户端的"访问令牌"已经过期,可以使用"更新令牌"申请一个新的访问令牌。

客户端发出更新令牌的HTTP请求,包含以下参数

...?grant_type=refresh_token&
refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
  1. granttype:授权类型,此处的值固定为"clientcredentials",必选项。
  2. scope:权限范围,可选项。
  3. refresh_token:更新令牌,必选项。

oauth2.0--基础--01--理论相关推荐

  1. OAuth2.0 基础概述

    web:http://oauth.net/2/ rfc:http://tools.ietf.org/html/rfc6749 doc:http://oauth.net/documentation/ c ...

  2. CREO 6.0 - 基础 - 01 - 零件 - 零件的装配 - 零件的移动、偏转、角度角度设定

    前沿: CREO几乎是每一个设计者都要用到的工具,非常好用,本节介绍一个基本功能:零件装配的时候,如何调整零件之间的夹角:   注意,是用这个图标:parametric 1 装入两个零件如图: 1.1 ...

  3. windows环境下32位汇编语言程序设计 90盘_Python 0基础详细教程 环境安装01

    Python语言有什么用,首先让大家了解Python语言的基本知识: Python语言是一种解释型,面向对象,动态数据类型的高级程序设计语言,Python语言是数据分析师的首选数据分析语言,通过数据挖 ...

  4. OAuth2.0的理解基础

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 1. 应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个&quo ...

  5. SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口

    一.SpringBoot 框架的特点 SpringBoot2.0 特点 1)SpringBoot继承了Spring优秀的基因,上手难度小 2)简化配置,提供各种默认配置来简化项目配置 3)内嵌式容器简 ...

  6. 卷毛0基础学习Golang-并发编程,01 什么是并发

    卷毛0基础学习Golang-并发编程,什么是并发 Go并发编程 概述 简而言之,所谓并发编程是指在一台处理器上"同时"处理多个任务. 随着硬件的发展,并发程序变得越来越重要.Web ...

  7. 微信公众平台开发 OAuth2.0网页授权认证

    一.什么是OAuth2.0 官方网站:http://oauth.NET/   http://oauth.Net/2/ 权威定义:OAuth is An open protocol to allow s ...

  8. SpringBoot2.0基础案例分类总结,后续更新计划说明

    一.基础案例 1.基础案例概览 历时一个半月,SpringBoot2.0基础案例的文章基本更新完毕了,基础案例包含了SpringBoot的基础教程,高级应用,日志配置,数据库使用,事务管理等.关于Sp ...

  9. 0基础趣学SEO,引爆流量,让客户主动找上门的躺赚神技

    [SEO课程内容] 先导课-进入SEO的神奇世界,0基础,你也可以成为流量大神 第01课:搜索引擎的前世今生,让你实现躺着赚钱的秘密 第02课:用好这三个工具,不懂代码也能建个"赚钱&quo ...

  10. 0基础学编程需要哪些基础?

    程序员薪酬高.工作环境好,是很多同学向往的职业,让很多非计算机专业的同学羡慕不已.非计算机专业难道就不能成为程序员了吗? 01 学编程需要什么基础? 1.数学基础 从计算机发展和应用的历史来看计算机的 ...

最新文章

  1. MySQL主从失败 错误Got fatal error 1236解决方法
  2. 去姥姥家需要做的事情
  3. Forever.Sun 从URL地址获取参数
  4. python改变字符串类型_python – Sklearn将字符串类标签更改为int
  5. 为什么说产品经理都该懂一点机器学习?
  6. switch和toggle在软件开发中的含义和区别
  7. Exynos4412 Uboot 移植(三)—— Uboot添加自定义命令
  8. 计划任务执行 php代码,php实现Windows任务计划定时执行的代码以及扩展(图)
  9. Linux常见问题解答--如何修复“tar:Exiting with failure status due to previous errors”
  10. Quartz定时器实现
  11. EXCEL里判断空值(有可能是函数返回的““),可用的3个函数counta() ,countblank() ,countif(),及语法注意点
  12. 设计模式基础-UML类图 (转自https://www.jianshu.com/p/0cd7df8a7789)
  13. 机房动环监控系统方案
  14. MacOS使用minicom工具配置华为交换机
  15. 正则表达式的用法和常用正则表达式大全(转)
  16. Blizzard经典之打造最快的Hash表
  17. 最详细的微信小程序制作方法
  18. Windows 10 打印机驱动无法删除和卸载的解决办法
  19. 程序员调试能力和相关书籍
  20. “安心记加班”完成亿元级B轮融资,蚂蚁金服领投

热门文章

  1. 系统无法停止通用卷解决方法
  2. 微软首款内置中文Cortana智能手机大陆上市
  3. java 邮件发送 多人_使用JavaMailSender向多人发送个性化邮件
  4. 新开博文,高兴的狠!心有猛虎,细嗅蔷薇。志在江山,细品清泉!
  5. Mysql - 从一个小 case 理解 MVCC
  6. 局域网乐趣之二:连接共享设置(示范系统windows2003)
  7. 中国穷人标准:年收入在3-8万之间
  8. 孝经白话:感应章第十六
  9. oracle杅擂踱阀葩,OraclERP产品总体介绍V10.ppt
  10. ceph集群节点扩容osd,rgw,mon,mgr