oauth2.0--基础--01--理论

2023-10-27

oauth3.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:更新令牌,必选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oauth2.0--基础--01--理论 的相关文章

随机推荐

  • 记一次Gitlab升级, 14.6.0-ee到14.10.0-ee

    升级原因 Gitlab无法删除项目 点删除按钮后项目依然存在 打开后提示 No repository 不确定是否这个版本问题 想通过版本升级重装一遍看能否解决问题 升级过程 时间 2022 04 27 当前最新版本GitLab Enterp
  • 那些你可能不知道的浏览器奇技淫巧

    平常工作少不了用浏览器 以下分享一些浏览器的使用技巧 更好的有助于你的工作 ps 以下技巧均在 Chrome 浏览器下测试的 网页长截图 按 F12 弹出控制台 按 ctrl shift p 弹出输入框 输入full 选择 capture
  • 二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放 一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。 对于两个格子坐标(x1,y1),(x2,y2)

    题目 二货小易有一个W H的网格盒子 网格的行编号为0 H 1 网格的列编号为0 W 1 每个格子至多可以放一块蛋糕 任意两块蛋糕的欧几里得距离不能等于2 对于两个格子坐标 x1 y1 x2 y2 的欧几里得距离为 x1 x2 x1 x2
  • JS-Array

    JS Array 数组的基本使用
  • 《软件测试的艺术》第九章 敏捷开发模式下的测试

    软件测试的艺术 第九章 敏捷开发模式下的测试 9 0 前言 9 1 敏捷开发的特征 9 2 敏捷测试 9 3 极限编程 XP 与测试 9 3 1 极限编程基础 9 3 1 1 XP计划 9 3 1 2 XP测试 9 3 2 极限测试 概念
  • 理解innodb的锁(record,gap,Next-Key lock)

    Record lock 单条索引记录上加锁 record lock锁住的永远是索引 而非记录本身 即使该表上没有任何索引 那么innodb会在后台创建一个隐藏的聚集主键索引 那么锁住的就是这个隐藏的聚集主键索引 所以说当一条sql没有走任何
  • 算法系列-leetcode-20.有效的括号

    20 有效的括号 简单 给定一个只包括 的字符串 s 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 示例 1 输入 s 输出 true 示例 2 输入 s 输出 true 栈 遇到左括号
  • 科普:手机电池的保护电路

    转自 http www elecfans com yuanqijian dianchi dianchijichu 20120905287417 html 此篇文章主要介绍手机电池的保护电路 我们大家在使用电池的时候总会发生各种误操作 而手机
  • 【图像隐藏】基于DWT与SVD算法实现数字水印嵌入提取附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • Spring State Machine

    Spring 状态机初探 一 spring statemachine 1 枚举定义 public enum OrderStatus WAIT PAYMENT 等待支付 WAIT RECEIVE 等待收货 FINISH 完成 public e
  • Javascript中获取数组最大值和最小值以及最大值和最小值的下标 没学对象前的最简单最基本的方法

    用for循环和if 为什么不用对象 因为这是还没学对象的时候留的作业 这个写法 数组里有重复值也可以识别 var arr 20 5 16 80 60 5 80 80 80 var max arr 0 var min arr 0 for va
  • python报错

    一 TypeError list indices must be integers or slices not str 暂无影响 未解决 二 Keyerror 解决方案 https blog csdn net jacke121 articl
  • C—数据的储存(下)

    文章目录 前言 一 练习一下 1 例一 2 例二 3 例三 4 例四 二 浮点型在内存中的储存 1 浮点数 2 浮点数存储 1 二进制浮点数 2 浮点数的存储规定 3 浮点数的取出规定 3 例题 总结 前言 个人主页 小沈熬夜秃头中 小编介
  • OCR技术原理

    OCR技术原理 文档识别技术功能特点图像输入 读取不同图像格式文件的算法 图像预处理 主要包括图像二值化 噪声去除 倾斜较正等算法 版面分析 将文档图片分段落 分行的算法就叫版面分析算法 字符切割 字符切割算法主要处理因字符粘连 断笔造成字
  • CCS6 配置工程头文件路径方法

    软件版本 Code Composer Studio Version 6 1 3 00034 配置头文件 给工程配置 右键工程名字没然后选择Properties 选择CCS Build gt Cxxxx Compiler gt Include
  • 【硬件设计】基于K78系列芯片的电源板电路

    文章目录 1 电源板介绍 1 1 电源板作用 1 2 电源板基本原理和类型 1 3 电源板应用场景 2 K78系列的线性稳压芯片介绍 2 1 K78系列线性稳压芯片的特点和基本参数 2 2 K78系列线性稳压芯片的工作原理 2 3 K78系
  • 《尚硅谷Redis7教程》笔记(大厂篇)

    1 Redis单线程 vs 多线程 How can Redis use multiple CPUs or cores Redis如何使用多个CPU或内核 https redis io docs getting started faq how
  • Python第四课

    枭 Python第四课 今天讲解了Python的 元组 字典 元组 性质 元组是有序不可变的 也就是只支持查 不支持增删改 元组是放在 中的 元组访问速度比列表更快 元组支持切片操作来访问元素 创建删除 在创建元组时 字符后面的逗号不能扔
  • Practical Programming in C

    本文转载至 http ocw mit edu courses electrical engineering and computer science 6 087 practical programming in c january iap
  • oauth2.0--基础--01--理论

    oauth3 0 基础 01 理论 1 快递员问题 1 1 问题描述 我经常点外卖 每天都有外卖员来送餐 我必须找到一个办法 让快递员通过门禁系统 进入小区 如果我把自己的密码 告诉快递员 他就拥有了与我同样的权限 就可以自由的出入小区 这