Day981.OAuth 2.0的工作流程与安全问题 -OAuth 2.0

news2024/10/7 20:28:29

OAuth 2.0的工作流程与安全问题

Hi,我是阿昌,今天学习记录的是关于OAuth 2.0的工作流程与安全问题的内容。


一、OAuth 2.0 工作流程串讲

在这里插入图片描述
OAuth 2.0 是一种授权协议,这种协议可以让第三方软件代表用户去执行被允许的操作。

那么,第三方软件就需要向用户索取授权来获得那个令牌。回想下OAuth 2.0是要通过什么方式解决什么问题百度王总的例子。只有拿到前台小姐姐给你的门禁卡,才能够进入百度大楼。这个过程就相当于前台小姐姐给你做了一次授权,而这个授权的凭证就是门禁卡。对应到系统中,门禁卡便相当于访问令牌。

通过“代表”“授权”这样的关键词,可以认识到,OAuth 2.0 是一个授权协议,也是一个安全协议。那么,如果说它也是一种委托协议,也不要吃惊。

用户在微信平台上有修改昵称、修改头像、修改个人兴趣的权限,当第三方软件请求让自己代表用户来操作这些权限的时候,就是第三方软件请求用户把这些权限委托给自己,用户在批准了委托请求之后,才可以代表用户去执行这些操作。这时,细想一下,委托才是 OAuth 2.0 授权概念的根基,因为没有“委托”之意就不会有“代表”行为的发生。

频繁举例和强调的就是授权码许可流程。在学习授权码流程的时候,最困惑的一点恐怕莫过于 “为什么要多此一举,非得通过**一个授权码 code 来换取访问令牌 access_token”**了吧。

这个问题在授权码许可类型中,为什么一定要有授权码?时也做过分析了,现在回想起来应该不会再为此“痛苦不堪” 了吧。再来分析下,第三方软件要获取访问令牌,只能通过两个渠道:

  • 一个渠道是第三方软件的前端页面。但是,如果直接返回到前端页面上,访问令牌是很容易被通过浏览器截获的,所以显然不可取。
  • 另外一个渠道是通过后端传输。第三方软件的后端和授权服务的后端之间通信,这样就可以避免令牌被直接暴露的问题。

第三方软件的后端总不能向授权服务的后端 “硬要” 吧,总要告诉授权服务是要哪个用户的 access_token 吧,所以还需要用户的参与。用户一旦参与进来,访问的第一个页面是第三方软件,用户要授权,第三方软件就需要把用户引导到授权服务页面。但这个时候,用户就跟第三方软件之间没有任何“通信连接”了。如果授权服务通过后端通信直接将令牌给了第三方软件的后端,那第三方软件该如何通知用户呢,恐怕就不太好实现了。这种情况下就很巧妙地引入了授权码 code:先把 code 通过重定向返回到第三方软件的页面;第三方软件通过浏览器获取到 code 后,再通过后端通信换取 access_token;待拿到 token 之后,由于此时用户已经在第三方软件的服务上,所以可以很容易地通知到用户。以上,就是授权码许可的整体工作流程了。

这是 OAuth 2.0 授权体系中最完备的流程,其他的授权许可类型,比如资源拥有者凭据许可、客户端凭据许可、隐式许可,都是以此为基础。因此,只要能理解授权码许可的流程,也就掌握了整个 OAuth 2.0 中所有许可类型的运转机制,在实际工作场景中用上 OAuth 2.0 将不再是问题。


二、OAuth 2.0 安全问题串讲

但是,到这里并没有万事大吉,只是解决了 OAuth 2.0 的基础使用的问题。要想用好、用对这个协议,成长为这个协议的应用专家,还必须关注 OAuth 2.0 的安全问题。在实践 OAuth 2.0 的过程中,还必须按照规范建议来执行,否则便会引发一系列的安全问题。这也往往导致有的同学会发出这样的疑问,OAuth 2.0 不是安全的吗?它不是一直在保护着互联网上成千上万个 Web API 吗,不也说它是一种安全协议吗?

首先说 OAuth 2.0 是安全协议没问题,但如果使用不当也会引起安全上的问题。比如,在OAuth2.0可能存在的安全问题中提到了一个很广泛的跨站请求伪造问题。之所以出现这样的安全问题,就是因为没有遵循 OAuth 2.0 的使用建议,比如没有使用 state 这样的参数来做请求的校验,或者是没有遵循授权码 code 值只能使用一次,并且还要清除使用过的 code 值跟 token 值之间的绑定关系的建议。

在安全问题上,其实一直都没有特别说明一点,那就是在使用 OAuth 2.0 的流程中,HTTP 通信要使用 HTTPS 协议来保护数据传输的安全性。这是因为 OAuth 2.0 支持的 bearer 令牌类型,也就是任意字符串格式的令牌,并没有提供且没有要求使用信息签名的机制。JWT 令牌有这样的加密机制啊。

这也正说明了 OAuth 2.0 是一个没有约束普通令牌的规则,所以才有了 JWT 这样对 OAuth 2.0 的额外补充。实际上,JWT 跟 OAuth 2.0 并没有直接关系,它只是一种结构化的信息存储,可以被用在除了 OAuth 2.0 以外的任何地方。

比如,重置密码的时候,会给你的邮箱发送一个链接,这个链接就需要能够标识出用户是谁、不能篡改、有效期 5 分钟,这些特征都跟 JWT 相符合。也就是说,JWT 并不是 OAuth 2.0 协议规范所涵盖的内容。

OAuth 2.0 似乎没有自己的规则约束机制,或者说只有比较弱的约束,但其实不是不约束,而是它就致力于做好授权框架这一件事儿。也可以验证出它的确很好地胜任了这项工作。

除此之外,OAuth 2.0 都是用开放的心态来提供基础的支持,比如OAuth 2.0实现一个OpenID Connect用户身份认证协议中的 OpenID Connect(OIDC)身份认证协议框架

这种开放的方式,使得可以用“OAuth 2.0+ 另外一个技术”来变成一个新的技术。这就是一个伟大的、可操作的组合了,可以解决不同场景的需求。也许正是因为 OAuth 2.0 可以支持类似 OIDC 这样的身份认证协议,导致总是“坚持”认为 OAuth 2.0 是一种身份认证协议。

OAuth 2.0 并不是身份认证协议,究竟是什么原因导致了对 OAuth 2.0 有这样的 “误解” 呢?大概原因是,OAuth 2.0 中确实包含了身份认证的内容,即授权服务需要让用户登录以后才可以进行用户确认授权的操作。但这样的流程,仅仅是 OAuth 2.0 涉及到了身份认证的行为,还不足以让 OAuth 2.0 成为一个真正的用户身份认证协议。

因为 OAuth 2.0 关心的只有两点,颁发令牌使用令牌,并且令牌对第三方软件是不透明的;同时,受保护资源服务也不关心是哪个用户来请求,只要有合法的令牌 “递” 过来,就会给出正确的响应,把数据返回给第三方软件。


三、再强调都不为过的安全意识

安全意识是实践 OAuth 2.0 过程中,再怎么强调都不为过的问题。因为总结起来,要说使用 OAuth 2.0 的过程中如果能有哪个机会让你“栽个大跟头”的话,那这个机会一定是在安全上:OAuth 2.0 本就是致力于保护开放的 Web API,保护用户在平台上的资源,如果因为 OAuth 2.0 使用不当而造成安全问题,确实是一件非常 “丢人” 的事情。

OAuth2.0 的流程里面能够为安全做贡献的只有两方:

  • 一方是第三方软件
  • 一方是平台方。

在安全性这个问题上,第三方软件开发者的安全意识参差不齐。那针对这一点,就需要平台方在其官方文档上重笔描述,并给出常见安全漏洞相应的解决方案。同时,作为平台方的内部开发人员,对安全的问题同样不能忽视,而且要有更高的安全意识和认知。

只有第三方软件开发者和平台方的研发人员共同保有较高的安全意识,才能让“安全的墙”垒得越来越高,让攻击者的成本越来越高。因为安全的本质就是成本问题。


四、总结

能记住以下三点:

  • OAuth 2.0 是一个授权协议,它通过访问令牌来表示这种授权。第三软件拿到访问令牌之后,就可以使用访问令牌来代表用户去访问用户的数据了。所以,我们说授权的核心就是获取访问令牌和使用访问令牌。
  • OAuth 2.0 是一个安全协议,但是如果使用不当,它并不能保证一定是安全的。如果不按照 OAuth 2.0 规范中的建议来实施,就会有安全风险。比如,没有遵循授权服务中的授权码只能使用一次、第三方软件的重定向 URL 要精确匹配等建议。
  • 安全防护的过程一直都是“魔高一尺道高一丈”,相互攀升的过程。因此,在使用 OAuth 2.0 的过程中,第三方软件和平台方都要有足够的安全意识,来把“安全的墙”筑得更高。

无论使用 OAuth 2.0 目的是保护 API,还是作为用户身份认证的基础,OAuth 2.0 都只是解决这些问题的一种工具。掌握 OAuth 2.0 这种工具的原理及其使用场景,将会帮助更高效、更优雅地解决这些问题。


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

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

相关文章

HI_NAS linux 记录

dev/root 100% 占用解决记录 通过下面的命令查看各文件夹 大小 sudo du --max-depth1 -h # 统计当前文件夹下各个文件夹的大小显示为M 最终发现Var/log 占用很大空间 发现下面两个 log 占用空间很大,直接 rm-rf 即可 HI NAS python3 记录 # 安装pip3 sudo apt u…

4.后端·新建子模块与开发(传统模式)

文章目录 学习资料新建子模块与各层查询entity的列表entitymapper层service层controller层 测试 学习资料 https://www.bilibili.com/video/BV13g411Y7GS?p8&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e b站的学习视频 新建子模块与各层 在r…

Angular变更检测机制

前段时间遇到这样一个 bug,通过一个 click 事件跳转到一个新页面,新页面迟迟不加载; 经过多次测试发现,将鼠标移入某个 tab ,页面就加载出来了。 举个例子,页面内容无法加载,但是将鼠标移入下图…

NO.396 旋转数组

题目 给定一个长度为 n 的整数数组 nums 。 假设 arrk 是数组 nums 顺时针旋转 k 个位置后的数组,我们定义 nums 的 旋转函数 F 为: F(k) 0 * arrk[0] 1 * arrk[1] ... (n - 1) * arrk[n - 1] 返回 F(0), F(1), ..., F(n-1)中的最大值 。 生成…

深度学习-卷积神经网络-纹理表示卷积神经网络-卷积神经网络-[北邮鲁鹏]

这里写目录标题 参考文章全连接神经网络全连接神经网络的瓶颈全连接神经网络应用场景 卷积神经网络卷积层(CONV)卷积核卷积操作卷积层设计卷积步长(stride)边界填充特征响应图组尺寸计算 激活层池化层(POOL)池化操作定义池化操作作用池化层超参数常见池化操作 全连接层(FC)样本…

linux相关知识以及有关指令3

在linux的世界中我们首先要有万物皆文件的概念,那么在系统中有那么多的文件,我们该怎么区分呢?文章目录 1. 文件分类2. 文件的权限1). 拥有者和所属组以及other2). 文件的权限3). 粘滞位4). 对于权限修改的拓展知识点a.修改权限b.修改拥有者所…

智慧工地平台源码 劳务实名制、视频监控、扬尘监测、起重机械安全监测

伴随着技术的不断发展,信息化手段、移动技术、智能穿戴及工具在工程施工阶段的应用不断提升,智慧工地概念应运而生,智慧工地平台围绕施工现场管理,构建全方位的智能监控防范体系弥补传统方法和技术在监管中的缺陷,形成…

分享一个Python 写的监控日志log txt文档 的代码

监控log文件的需求 某些特殊原因,想一直看到.log 的最后一行打印,所以写了一些代码监控log (有个奇怪需求,就是log 因为重复启动原因,会一直加,不是同一个log) 监控界面 涉及的Python代码&…

管理类联考——数学——汇总篇——知识点突破——代数——数列——秒杀

🐟 ⛲️ 特殊值秒解数列 当数列题目中只有一个条件时,在不违背题意的条件下,可以直接利用特殊值, 令其公差为0或公比为1。 注意:一定要检验是否符合题意,题目中如果出现公差不为0或公比不为1,则…

华为云云耀云服务器L实例评测|部署前后端分离项目

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 学习测评 ✨特色专栏: MyS…

[NLP] LLM---<训练中文LLama2(一)>训练一个中文LLama2的步骤

一 数据集 【Awesome-Chinese-LLM中文数据集】 【awesome-instruction-dataset】【awesome-instruction-datasets】【LLaMA-Efficient-Tuning-数据集】Wiki中文百科(25w词条)wikipedia-cn-20230720-filteredBaiduBaiKe(563w词条) …

VIRTIO-SCSI代码分析(3)VIRTIO SCSI数据流处理

VIRTIO SCSI整体数据流如下: IO请求下发过程 虚拟机中通过FIO等下发IO请求,IO请求通过VFS/filesystem,BLOCK层,然后到SCSI层,传递给virtio-scsi驱动,virtio-scsi驱动通过virtioscsi_commit_rqs()下发IO请求…

利用 SOAR 加快事件响应并加强网络安全

随着攻击面的扩大和攻击变得越来越复杂,与网络攻击者的斗争重担落在了安全运营中心 (SOC) 身上。SOC 可以通过利用安全编排、自动化和响应 (SOAR) 平台来加强组织的安全态势。这一系列兼容的以安全为中心的软件可加快事…

【100天精通Python】Day63:Python可视化_Matplotlib绘制子图,子图网格布局属性设置等示例+代码

目录 1 基本子图绘制示例 2 子图网格布局 3 调整子图的尺寸 4 多行多列的子图布局 5 子图之间的共享轴 6 绘制多个子图类型 7 实战: 绘制一个大图,里面包含6个不同类别的子图,不均匀布局。 绘制子图(subplots)…

redis的安装、基础命令学习、常用数据结构

文章目录 前言一、Redis安装1.Ubuntu下安装(1)切换到root用户下(2)使用apt安装redis5(3)为了使redis支持远程连接,修改以下地方(4)验证安装是否成功 2.Centos7下安装&…

基于Java+SpringBoot+Vue+uniapp点餐小程序(包含协同过滤算法和会员系统,强烈推荐!)

校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 系统功能结构设计4.2 主要功能描述 五…

理清Spring事务的核心关键类

在spring事务源码的内部,会有几个比较核心关键的类,虽然这基本上都是源码内部才使用到的类,但是有时候我们要对其做一些改造的时候免不了要去使用到这些类,并且这些类在spring事务内部都是起到关键的作用,对了解spring…

[2023-09-13]使用EXPDP/IMPDP迁移数据库后统计信息引起的性能问题

问题描述: 客户在使用expdp/impdp迁移数据库完成后,在新环境收集统计信息,但是在迁移完成的当天中午,好多SQL语句执行变慢,执行计划发生了改变,下面通过案例来说明。 1、准备数据 scott用户下创建test表&…

进程控制再学习

0.“开两个终端窗口” 因为学校用的虚拟机,得用终端登录,不能像shell一样直接复制窗口。 我们只需要登录两次就可以了(方便监视) 1.ps 1.循环ps while :;do ps -f;ps -ef|grep zombie;done 每秒打印一次: while :…

基于SSM+Vue的校园教务系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…