OAuth2.0 四种授权方式讲解

一、OAuth2.0 的理解

        OAuth2是一个开放的授权标准,允许第三方应用程序以安全可控的方式访问受保护的资源,而无需用户将用户名和密码信息与第三方应用程序共享。OAuth2被广泛应用于现代Web和移动应用程序开发中,可以简化应用程序与资源服务器之间的授权过程,提高应用程序的安全性。

OAuth2的基本工作原理如下:

案例解读:

用户授权第三方应用程序访问其社交媒体账户

  1. 用户在第三方应用程序中点击“登录”或“授权”按钮。
  2. 第三方应用程序将用户重定向到社交媒体平台的授权页面。
  3. 用户在授权页面上输入其社交媒体账户的用户名和密码(或扫码),并点击“授权”。
  4. 社交媒体平台会向用户展示授权详细信息,如应用程序名称、权限范围等,并要求用户确认授权。
  5. 用户点击“确认授权”后,社交媒体平台会向第三方应用程序颁发一个访问令牌(Access Token)。
  6. 第三方应用程序将访问令牌存储起来,并使用该访问令牌来访问社交媒体平台上的受保护资源,如用户个人信息、社交分享、好友列表等。

        在这个案例中,第三方应用程序是OAuth2的客户端应用程序,社交媒体平台是OAuth2的资源服务器,用户是OAuth2的资源所有者。OAuth2服务器是社交媒体平台提供的服务,负责颁发访问令牌。

OAuth2的工作流程可以总结为以下几个步骤:

  1. 客户端应用程序请求用户授权。
  2. 用户授权后,客户端应用程序向OAuth2服务器请求访问令牌。
  3. OAuth2服务器颁发访问令牌给客户端应用程序。
  4. 客户端应用程序使用访问令牌访问资源服务器上的受保护资源。

        OAuth2通过将用户密码信息与第三方应用程序隔离,提高了应用程序的安全性。同时,OAuth2是一个开放的标准,可以与不同的应用程序、平台和设备兼容,易于理解和使用,可以快速集成到应用程序中。

二、OAuth2.0 授权方式 

OAuth2.0 的授权简单理解其实就是获取令牌(token)的过程,OAuth 协议定义了四种获得令牌的授权方式(authorization grant )如下:

  • 授权码(authorization-code
  • 隐藏式(implicit
  • 密码式(password):
  • 客户端凭证(client credentials

        但值得注意的是,不管我们使用哪一种授权方式,在三方应用申请令牌之前,都必须在系统中去申请身份唯一标识:客户端 ID(client ID)和 客户端密钥(client secret)。这样做可以保证 token 不被恶意使用。授权码模式和密码模式比较常用。

2.1 授权码模式

        授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。  

OAuth2.0四种授权中授权码方式是最为复杂,但也是安全系数最高的,比较常用的一种方式。这种方式适用于兼具前后端的Web项目,因为有些项目只有后端或只有前端,并不适用授权码模式。

利用qq登录扫码授权示例:

请求示例:

(A)步骤:客户端申请认证的URI

https://graph.qq.com/oauth2.0/show?which=Login

&display=pc

&scope=get_idollist%2Cget_fans……

&response_type=code

&redirect_uri=https%3A%2F%2Fpassport.iqiyi.com%2……

&client_id=xxxx

&state=ZOvw70n5zJtY1H%2……

参数说明:

参数类型说明
response_type授权类型,必选项,此处的值固定为"code"
client_id客户端的ID,必选项
redirect_uri重定向URI,认证服务器接受请求之后的调转连接,可以根据这个连接将生成的授权码回传,必选项
scopecode发送给资源服务器申请的权限范围,可选项
state任意值,认证服务器会原样返回,用于抵制CSRF(跨站请求伪造)攻击。

(B)步骤:用户·确认授权

(C)步骤:服务器回应客户端的URI

https://graph.qq.com//client.example.com/cb?code=SplxlOBeZQQ&state=xxx

参数说明:

参数类型说明
code授权码,必选项。授权码有效期通常设为10分钟,一次性使用。该码与客户端ID、重定向URI以及用户,是一一对应关系。
state原样返回客户端传的该参数的值

(D)步骤:客户端向认证服务器申请令牌

https://graph.qq.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

参数说明:

参数类型说明
client_id表示客户端ID,必选项
client_secret表示安全参数,只能在后端发请求
grant_type表示使用的授权模式,必选项,此处的值固定为"authorization_code"
code表示上一步获得的授权码,必选项
redirect_uri表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致

(E)步骤:响应(D)步骤的数据


    "access_token":访问令牌, 
    "token_type":"bearer", 
    "expires_in":过期时间, 
    "refresh_token":"REFRESH_TOKEN", 
    "scope":"read", 
    "uid":用户ID,
    "info":{...} 
}

参数说明:

参数类型说明
access_token访问令牌,必选项
token_type令牌类型,该值大小写不敏感,必选项
expires_in过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间
refresh_token更新令牌,用来获取下一次的访问令牌,可选项
scope权限范围,如果与客户端申请的范围一致,此项可省略

2.2 密码模式

如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。

在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而授权服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

适用场景:公司搭建的授权服务器

(A)用户向客户端提供用户名和密码。

(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C)认证服务器确认无误后,向客户端提供访问令牌。

2.3 客户端模式 

 客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行 授权。

适用于没有前端的命令行应用,即在命令行下请求令牌。一般用来提供给我们完全信任的服务器端服务。

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B)认证服务器确认无误后,向客户端提供访问令牌。

一些具体的客户端凭证模式的使用场景包括:

  • 物联网设备: 物联网设备通常需要连接到云平台来发送数据和接收指令。可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。
  • 智能家居设备: 智能家居设备通常需要连接到云平台来接收指令和控制其他智能家居设备。可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。
  • 可穿戴设备: 可穿戴设备通常需要连接到云平台来同步数据和接收指令。可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。
  • 后台数据处理任务: 后台数据处理任务通常需要访问某个API来获取数据或处理数据。可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。
  • 服务集成: 两个服务之间需要集成,可以使用客户端凭证模式来获取访问令牌,而不需要用户登录。

2.4 隐藏

        有些 Web 应用是纯前端应用,没有后端。必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌,这种方式没有授权码这个中间步骤,所以称为(授权码)"隐藏式"(implicit)。跳过授权码,qq授权通过后重定向到指定 redirect_uri 。

https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=http://juejin.im/callback&scope=read

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

这种方式把令牌直接传给前端,是很不安全的。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样学习嵌入式C语言编程

目录 C语言编程分类c语言入门学习C语言单片机开发C语言linux应用开发C语言linux驱动开发C语言开发其他问题参考链接 C语言编程分类 C语言编程,这里分成这几类:1.c语言入门学习;2.C语言单片机开发;3.C语言linux应用开发;4.C语言linux驱动开发. c语言入门学习 学习一本书籍即可…

行业报告 | 中国AI大模型成长之路,披荆斩棘创佳绩

原创 | 文 BFT机器人 前言: 相信大家现在对于AI大模型这个概念都清楚,毕竟现在AI大模型渗入到了我们各个生活场景中,这股科技之风吹遍了中国大大小小的城市,近年来看,还有越吹越烈之势。今天小编带你们来了解一下我国…

java并发编程六 共享模型之内存

文章目录 Java 内存模型可见性解决方法 有序性解决方法 Java 内存模型 JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。 JMM 体现在以下几个方面 原子性 - 保证指令不会受到线程上…

力扣算法练习BM71——最小上升子序列

题目 给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。 所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如 [1,5,3,7,3] 数组,其子序列有:[1,3,3]、[7] 等。…

STM32独立看门狗

时钟频率 40KHZ 看门狗简介 STM32F10xxx 内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看 门狗设备 ( 独立看门狗和窗口看门狗 ) 可用来检测和解决由软件错误引起的故障;当计数器达到给 定的超时值时,触发一个中…

腾讯云2核4G服务器CVM标准型S5实例5年优惠价格表

腾讯云服务器续费贵所以一次性买3年或5年,腾讯云轻量应用服务器3年价格有优惠,CVM云服务器5年有特价,腾讯云3年轻量和5年云服务器CVM优惠活动入口,3年轻量应用服务器配置可选2核2G4M和2核4G5M带宽,5年CVM云服务器可以选…

陈可之|三峡|《河水不犯井水的游戏》

《河水不犯井水的游戏》 尺寸:130x90cm 陈可之2007年绘 油画《河水不犯井水的游戏》是陈可之先生三峡系列作品之一,巧借古代传说,并具象化为螃蟹、乌龟、长江水,描绘了一幅和谐共生的画面。 画面右侧,蜿蜒宽阔的长江水…

强化学习_06_pytorch-TD3实践(CarRacing-v2)

0、TD3算法原理简介 详见笔者前一篇实践强化学习_06_pytorch-TD3实践(BipedalWalkerHardcore-v3) 1、CarRacing环境观察及调整 Action SpaceBox([-1. 0. 0.], 1.0, (3,), float32)Observation SpaceBox(0, 255, (96, 96, 3), uint8) 动作空间是[-1~1, 0~1, 0~1]&#xff0c…

网络安全选择题20道——附答案

一.网络安全选择题(20道) 1.常见的网络攻击类型中,以下哪个是一种拒绝服务(DoS)攻击? A. 木马 B. SQL注入 C. 垃圾邮件 D. SYN洪水攻击 2.下列哪项不是网络安全的三要素之一? A. 机密性 B. 可…

解决国内大模型痛点的最佳实践方案

1.前言 自AI热潮掀起以来,国内互联网大厂躬身入局,各类机构奋起追赶,创业型企业纷至沓来。业内戏称,一场大模型的“百模大战”已经扩展到“千模大战”。 根据近期中国科学技术信息研究所发布的《中国人工智能大模型地图研究报告…

【2023下算法课设】Gray码的分治构造算法

Gray码是一个长度为2ⁿ的序列,序列中无相同元素,且每个元素都是长度为n位的二进制位串,相邻元素恰好只有1位不同。例如长度为2的格雷码为(000,001,011,010,110,111,101,100),设计分治算法对任意的n值构造相…

iOS设备信息详解

文章目录 ID 体系iOS设备信息详解IDFA介绍特点IDFA新政前世今生获取方式 IDFV介绍获取方式 UUID介绍特点获取方式 UDID介绍获取方式 OpenUDID介绍 Bundle ID介绍分类其他 IP地址介绍获取方式 MAC地址介绍获取方式正常获取MAC地址获取对应Wi-Fi的MAC地址 系统版本获取方式 设备型…

云HIS源码 云HIS解决方案 支持医保功能

云HIS系统重建统一的信息架构体系,重构管理服务流程,重造病人服务环境,向不同类型的医疗机构提供SaaS化HIS服务解决方案。 云HIS作为基于云计算的B/S构架的HIS系统,为基层医疗机构(包括诊所、社区卫生服务中心、乡镇卫…

【华为数据之道学习笔记】6-7打造业务自助分析的关键能力

华为公司将自助分析作为一种公共能力,在企业层面进行了统一构建。一方面,面向不同的消费用户提供了差异性的能力和工具支撑;另一方面,引入了“租户”概念,不同类型的用户可以在一定范围内分析数据、共享数据结果。 1. …

【力扣100】199.二叉树的右视图

添加链接描述 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def rightSideView(self, root: Optional[Tr…

【贪心算法】专题练习一

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 前言 1.什么是贪心算法?——贪婪鼠目寸光 贪心策…

stat模块--python

在Python中,stat模块提供了一些用于解释os.stat(), os.lstat()和os.fstat()返回的结果的函数和常量。这些函数可以获取文件或文件系统节点的信息。 以下是一些stat模块中的函数和常量: stat.S_ISDIR(mode):如果mode是目录,则返回True。 stat.S_ISREG(mode):如果mode是普通…

在pyqt5界面中直接设置图标icon,不需要python程序代码!!一步搞定!!

小白轻松玩转pyqt5 1. 第一步:点击mainwindow,然后在windowicon中上传图片即可2. 设置成功总结(对于小白入门pyqt5的一些忠告) 1. 第一步:点击mainwindow,然后在windowicon中上传图片即可 2. 设置成功 总结(对于小白入…

【Java 进阶篇】Jedis 操作 List:Redis中的列表类型

Redis中的列表(List)是一种有序的、可重复的数据类型,支持在列表的两端进行元素的插入和删除操作。Jedis作为Java开发者与Redis交互的工具,提供了丰富的API来操作List类型。本文将深入介绍Jedis如何操作Redis中的List类型数据&…

linux java环境安装

linux java1.8环境安装 下载 官方下载页面:https://www.oracle.com/cn/java/technologies/downloads/ 选择[jdk-8u391-linux-x64.tar.gz]下载,解压到/usr/local下。 # 建立软连接,以后如果更换版本,只需要解压,并更…