Day973.授权码许可类型中,为什么一定要有授权码? -OAuth 2.0

news2024/11/25 8:15:16

授权码许可类型中,为什么一定要有授权码?

Hi,我是阿昌,今天学习的是auth2中为什么一定要有授权码的内容。

OAuth 2.0 的授权码许可类型,在小兔打单软件的例子里面,小兔最终是通过访问令牌请求到小明的店铺里的订单数据。

同时呢,这个访问令牌是通过授权码换来的。那

为什么要用授权码来换令牌?为什么不能直接颁发访问令牌呢?

一、为什么需要授权码?

在 OAuth 2.0 的体系里面有 4 种角色,按照官方的称呼它们分别是资源拥有者客户端授权服务受保护资源。不过,这里的客户端,称其为第三方软件

所以,在看官方资料的时候,可以自己对应下。将官方的称呼 “照进现实”,对应关系就是:

  • 资源拥有者 -> 小明
  • 第三方软件 -> 小兔软件
  • 授权服务 -> 京东商家开放平台的授权服务
  • 受保护资源 -> 小明店铺在京东上面的订单

OAuth 诞生之初就是为了解决 Web 浏览器场景下的授权问题,所以基于浏览器的场景,在小明使用小兔软件打印订单的整体流程的基础上,画了一个授权码许可类型的序列图。

把小兔软件的前端和后端分开展示,并把京东商家开放平台的系统按照 OAuth 2.0 的组件拆分成了授权服务和受保护资源服务。

如下图所示:

图1 以小兔软件为例,授权码许可类型的序列图

从图中看到,在第 4 步授权服务生成了授权码 code,按照一开始提出来的问题,如果不要授权码,这一步实际上就可以直接返回访问令牌 access_token 了。按着这个没有授权码的思路继续想,如果这里直接返回访问令牌,那肯定不能使用重定向的方式。

因为这样会把安全保密性要求极高的访问令牌暴露在浏览器上,从而将会面临访问令牌失窃的安全风险。

显然,这是不能被允许的。也就是说,如果没有授权码的话,就只能把访问令牌发送给第三方软件小兔的后端服务。

按照这样的逻辑,上面的流程图就会变成下面这样:

图2 如果没有授权码,直接把访问令牌发送给第三方软件小兔的后端服务

小明访问小兔软件,小兔软件说要打单你得给我授权,不然京东不干,然后小兔软件就引导小明跳转到了京东的授权服务。

到授权服务之后,京东商家开放平台验证了小兔的合法性以及小明的登录状态后,生成了授权页面。

紧接着,小明赶紧点击同意授权,这时候,京东商家开放平台知道可以把小明的订单数据给小兔软件。

于是,京东商家开放平台没含糊,赶紧生成访问令牌 access_token,并且通过后端服务的方式返回给了小兔软件。

这时候,小兔软件就能正常工作了。


这样,问题就来了,什么问题呢?

当小明被浏览器重定向到授权服务上之后,小明跟小兔软件之间的 “连接” 就断了,相当于此时此刻小明跟授权服务建立了“连接”后,将一直“停留在授权服务的页面上”。会看到图 2 中问号处的时序上,小明再也没有重新“连接”到小兔软件。但是,这个时候小兔软件已经拿到了小明授权之后的访问令牌,也使用访问令牌获取到了小明店铺里的订单数据。

这时,考虑到“小明的感受”,小兔软件应该要通知到小明,但是如何做呢?现在“连接断了”,这事儿恐怕就没那么容易了。

OK,为了让小兔软件能很容易地通知到小明,还必须让小明跟小兔软件重新建立起 “连接”

这就是看到的第二次重定向,小明授权之后,又重新重定向回到了小兔软件的地址上,这样小明就跟小兔软件有了新的 “连接”。

到这里,就能理解在授权码许可的流程中,为什么需要两次重定向了吧。


为了重新建立起这样的一次连接,又不能让访问令牌暴露出去,就有了这样一个临时的、间接的凭证授权码

因为小兔软件最终要拿到的是安全保密性要求极高的访问令牌,并不是授权码,而授权码是可以暴露在浏览器上面的。

这样有了授权码的参与,访问令牌可以在后端服务之间传输,同时呢还可以重新建立小明与小兔软件之间的“连接”。

这样通过一个授权码,既“照顾”到了小明的体验,又“照顾”了通信的安全。

那么,在执行授权码流程的时候,授权码和访问令牌在小兔软件和授权服务之间到底是怎么流转的呢?


二、授权码许可类型的通信过程

所谓的间接通信就是指获取授权码的交互,而直接通信就是指通过授权码换取访问令牌的交互

看看哪些是间接通信,哪些又是直接通信。

1、间接通信

先分析下为什么是“间接”。

把图 1 中获取授权码 code 的流程 “放大”,并换个角度来看一看,也就是将浏览器这个代理放到第三方软件小兔和授权服务中间。

于是,下面这张图:

图3 获取授权码的交互过程

这个过程,仿佛有这样的一段对话。

小明:“你好,小兔软件,我要访问你了。”
小兔软件:“好的,我把你引到授权服务那里,我需要授权服务给我一个授权码。”
授权服务:“小兔软件,我把授权码发给浏览器了。”
小兔软件:“好的,我从浏览器拿到了授权码。”

不知道你注意到没有,第三方软件小兔和授权服务之间,并没有发生直接的通信,而是通过浏览器这个“中间人” 来 “搭线”的。

因此,说这是一个间接通信的方式。


2、直接通信

为什么是“直接”的。

再把图 1 中获取访问令牌的流程“放大”,就得到了下面的图示:

图4 授权码换取访问令牌的交互过程

相比获取授权码过程的间接通信,获取访问令牌的直接通信就比较容易理解了,就是第三方软件小兔获取到授权码 code 值后,向授权服务发起获取访问令牌 access_token 的通信请求。

这个请求是第三方软件服务器跟授权服务的服务器之间的通信,都是在后端服务器之间的请求和响应,因此也叫作后端通信


3、两个 “一伙”

了解了上面的通信方式之后,不知道有没有意识到,OAuth 2.0 中的 4 个角色是 “两两站队” 的:

资源拥有者和第三方软件“站在一起”,因为第三方软件要代表资源拥有者去访问受保护资源;

授权服务和受保护资源“站在一起”,因为授权服务负责颁发访问令牌,受保护资源负责接收并验证访问令牌。

图5 OAuth 2.0 中的4个角色是“两两站队”

浏览器一定要参与到这个流程中吗?

其实,授权码许可流程,不一定要有浏览器的参与。


三、一定要有浏览器吗?

OAuth 2.0 发展之初,开放生态环境相对单薄,以浏览器为代理的 Web 应用居多,授权码许可类型 “理所当然” 地被应用到了通过浏览器才能访问的 Web 应用中。

实际上,OAuth 2.0 是一个授权理念,或者说是一种授权思维。它的授权码模式的思维可以移植到很多场景中,比如微信小程序。

在开发微信小程序应用时,我们通过授权码模式获取用户登录信息,官方文档的地址示例中给出的 grant_type=authorization_code ,就没有用到浏览器。

根据微信官方文档描述,开发者获取用户登录态信息的过程正是一个授权码的许可流程:

  • 首先,开发者通过 wx.login(Object object) 方法获取到登录凭证 code 值,这一步的流程是在小程序内部通过调用微信提供的 SDK 实现;
  • 然后,再通过该 code 值换取用户的 session_key 等信息,也就是官方文档的 auth.code2Session 方法,同时该方法也是被强烈建议通过开发者的后端服务来调用的。

可以看到,这个过程并没有使用到浏览器,但确实按照授权码许可的思想走了一个完整的授权码许可流程。

也就是说,先通过小程序前端获取到 code 值,再通过小程序的后端服务使用 code 值换取 session_key 等信息,只不过是访问令牌 access_token 的值被换成了 session_key。

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

这整个过程体现的就是授权码许可流程的思想


四、总结

从为什么需要授权码这个问题开始讲起,并通过授权码把授权码许可流程整体的通信过程串了一遍,提到了授权码这种方式解决的问题,也提到了授权码流程的通信方式。

总结来说,以下两点。

  1. 授权码许可流程有两种通信方式
    • 一种是前端通信,因为它通过浏览器促成了授权码的交互流程,比如京东商家开放平台的授权服务生成授权码发送到浏览器,第三方软件小兔从浏览器获取授权码。正因为获取授权码的时候小兔软件和授权服务并没有发生直接的联系,也叫做间接通信
    • 另外一种是后端通信,在小兔软件获取到授权码之后,在后端服务直接发起换取访问令牌的请求,也叫做直接通信
  2. 在 OAuth 2.0 中,访问令牌被要求有极高的安全保密性,因此我们不能让它暴露在浏览器上面,只能通过第三方软件(比如小兔)的后端服务来获取和使用,以最大限度地保障访问令牌的安全性。正因为访问令牌的这种安全要求特性,当需要前端通信,比如浏览器上面的流转的时候,OAuth 2.0 才又提供了一个临时的凭证:授权码。通过授权码的方式,可以让用户小明在授权服务上给小兔授权之后,还能重新回到小兔的操作页面上。这样,在保障安全性的情况下,提升了小明在小兔上的体验。

从授权码许可流程中就可以看出来,它完美地将 OAuth 2.0 的 4 个角色组织了起来,并保证了它们之间的顺畅通信。它提出的这种结构和思想都可以被迁移到其他环境或者协议上,比如在微信小程序中使用授权码许可。

不过,也正是因为有了授权码的参与,才使得授权码许可要比其他授权许可类型,在授权的流程上多出了好多步骤,让授权码许可类型成为了 OAuth 2.0 体系中迄今流程最完备、安全性最高的授权流程。


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

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

相关文章

使用raspberry pi pico 制作红绿灯

需要的东西:一块面包版、一块raspberry pi pico、红绿黄led灯各一颗、220欧电阻3只、若干线 编程软件:thonny 操作系统:deepin 23 结果展示: 使用raspberry pi pico 制作红绿灯 from machine import Pin import utime yellowled…

4种整流电路和5种滤波电路

4种整流电路和5种滤波电路 基本电路:一般直流稳压电源都使用220伏市电作为电源,经过变压、整流、滤波后输送给稳压电路进行稳压,最终成为稳定的直流电源。这个过程中的变压、整流、滤波等电路可以看作直流稳压电源的基础电路,没有…

前端人必须知道的三种移动跨平台方案

跨平台技术是前端人必备技能,今天就来为大家解读一下近几年业界主流的三大移动端跨平台方案: Web 天然跨平台: Web App、PWA(Progressive Web Apps)、Hybrid App、PHA(Progress Hybrid App)都可…

Springboot自定义starter

文章目录 前言1.引入依赖1.1 json的转换1.2 xml转换依赖 2.定义Formate核心转化接口3.实现核心接口json和xml的转换3.1 json转换的实现3.2 xml转换的实现 4. FormatProperties类5.FormatAutoConfiguration 类配置6.提供一个MyFormatTemplate 模板类7.注册到springboot8.创建spr…

cavity开盖制作的辅助层别

cavity开盖工艺制作的辅助层别 数量:6个

suricata的flow流会话管理分析1

在《suricata中的线程管理分析》一文中,我们看到suricata中有FlowWorker和FlowManager两个线程来处理流表,说明流表的实现应该不简单,果然,看了流相关的这块代码后,发现确实有点复杂,代码估计得慢慢坑&…

[SpringMVC]Controller控制器、Interceptor拦截器、RestFul风格、异常处理、JSON数据格式与AJAX请求

文章目录 MVC理论基础配置环境并搭建项目Controller控制器配置视图解析器和控制器RequestMapping详解RequestParam和RequestHeader详解CookieValue和SessionAttrbutie重定向和请求转发Bean的Web作用域 RestFul风格Interceptor拦截器创建拦截器多级拦截器 异常处理JSON数据格式与…

C# Socket入门编程winform案例(附下载链接)

C# socket编程实现信息的接收(winform) 点我下载项目资源 服务器端: 第一步:建立一个用于通信的Socket对象 第二步:使用bind绑定IP地址和端口号 第三步:使用listen监听客户端 第四步:使用accep…

宝安西乡产业园变九年制学校,新增宅地、商地。

6月5日,宝安区城市更新和土地整备局发布《西乡街道盐田社区银田地块土地整备利益统筹项目土地整备规划(草案)》(以下简称草案)。 草案显示,该项目经过调整后: ● 新增一块二类居住用地&#xf…

王者荣耀战区活跃度排名怎么实现的?这篇文章给你答案!

🍉博客主页:阿博历练记 📖文章专栏:数据结构与算法 🚍代码仓库:阿博编程日记 🍥欢迎关注:欢迎友友们点赞收藏关注哦🌹 文章目录 🌈前言🍪堆的实现🔍1.堆的结构框架🔍2.堆…

通过ChatGPT打造10W+公众号文章

大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加:keeepdance,备注:chatgpt。 这是一篇非常具有实操性的指南,可能会动到一些某些行业人的蛋糕,但我无益于此。我是…

pnpm的安装和使用

1 安装 1.1 安装教程 npm全局安装pnpm npm install -g pnpm设置镜像地址 获取当前配置的镜像地址 pnpm get registry设置新的镜像地址 pnpm set registry https://registry.npm.taobao.org设置包存放地址 pnpm config set store-dir E:/xxx1.2 安装问题 当在vscode上使用…

在labview里使用LabSQL连接ACCESS数据库

使用LabSQL连接ACCESS数据库 写在前面ODBC数据源管理器的配置LV软件里使用结束 写在前面 ACCESS数据库一般包含在Office组件里,安装完Office后就可以直接拿来使用,要求不高的场合适合使用。 LabSQL工具包直接放进LV的安装目录下,打开软件后在…

SpringBootWeb案例-1(下: 来源黑马程序员)

3. 员工管理 完成了部门管理的功能开发之后,我们进入到下一环节员工管理功能的开发。 基于以上原型,我们可以把员工管理功能分为: 分页查询带条件的分页查询删除员工新增员工修改员工 3.1 分页查询 3.1.1 基础分页 3.1.1.1 需求分析 我…

YOLOV8 Onnxruntime Opencv DNN C++部署

1.Opencv介绍 OpenCV由各种不同组件组成。OpenCV源代码主要由OpenCV core(核心库)、opencv_contrib和opencv_extra等子仓库组成。近些年,OpenCV的主仓库增加了深度学习相关的子仓库:OpenVINO(即DLDT, Deep Learning Deployment Toolkit)、open_model_zoo,以及标注工具CV…

C++标准模板库 队列容器的使用

队列:在数据结构中也成为操作受限的线性表,是一种只允许在表的一端插入,在另一端删除的线性表 特点:先进先出,像打饭《排在最前面的先买,后到的排在队尾,即删除在队头,插入在队尾》…

面试测试工程师,都要考察什么?

今年刚接触了(功能)测试工程师的面试工作,有遇到对信贷业务流程较熟悉的、工作内容纯测试app功能的、什么都接触过但是不够深入的,发现简历上写的东西和实际真的有点差距,面试也是一个艺术活。 如果你想学习自动化测试…

Security Onion(安全洋葱)开源入侵检测系统(ids)安装

文章目录 Security Onion介绍安装配置(最低)安装步骤web界面 Security Onion介绍 Security Onion是一款专为入侵检测和NSM(网络安全监控)设计的Linux发行版。其安装过程很简单,在短时间内就可以部署一套完整的NSM收集、检测和分析的套件。Se…

高完整性系统(6)Alloy核心语法 + 有限状态机(Finite State Machines);check assertion amination

文章目录 Alloy 核心内容sig数据类型varonefactpre-conditionfunpred 谓词谓词的构成谓词的结果 / 普通条件约束和 pre-post condition 的区别 Finite State Machines 有限状态机FSM in Alloy Check Specification动画(Animation):run 关键字…

安装superset并连接clickhouse

说明: Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用,可对接各种数据源,包括很多现代的大数据分析引擎,拥有丰富的图表展示形式,并且支持自定义仪表盘。 使用的服务器操作系统为CentOS 7&a…