OAuth2.0 最简向导

本文是一篇关于OAuth2.0的启蒙教程,图文并茂,通俗易懂,力求用最简洁明了的方式向初学者解释OAuth2.0是什么。本文并不是冗杂难懂的长篇大论,一图胜千言,深入浅出OAuth2.0,知其然知其所以然。

参考文献

首先,需要有用户数据:

在这里插入图片描述

然后有个负责存储管理用户数据的资源服务器:

在这里插入图片描述

有个能够访问用户数据的客户端应用:

在这里插入图片描述

接着资源服务器会暴露出API接口,供客户端应用进行调用:
在这里插入图片描述

然后客户端应用可以通过这个API接口去访问用户数据:

在这里插入图片描述

最后资源服务器将用户数据返回给客户端应用:

在这里插入图片描述

如果来了个恶意客户应用怎么办:
在这里插入图片描述

即使恶意客户应用要求访问用户数据:
在这里插入图片描述

资源服务器还是返回用户数据:

在这里插入图片描述

因此需要一种机制来保护用户数据:

在这里插入图片描述

业界实践是提前给客户应用颁发一个Access Token, 它表示客户应用被授权可以访问用户数据:

在这里插入图片描述

访问用户数据时,给出Access Token:

在这里插入图片描述

资源服务器取出请求中的Access Token:

在这里插入图片描述

并校验Access Token确认客户应用有访问 用户数据的权限:

在这里插入图片描述

校验通过后,资源服务器返回用户数据:

在这里插入图片描述

该机制可以工作的前提是 必须提前给客户应用颁发Access Token:

在这里插入图片描述

那么就需要颁发Access Token的角色:

在这里插入图片描述

那么到底是谁来颁发Access Token呢?

在这里插入图片描述

授权服务器和客户应用的关系如下:

在这里插入图片描述

授权服务器负责生成Access Token:

在这里插入图片描述

并给客户应用颁发Access Token:

在这里插入图片描述

角色回顾:一个授权服务器,一个客户应用,一个资源服务器:

在这里插入图片描述

授权服务器负责生成Access Token:

在这里插入图片描述

并将Access Token颁发给客户应用:

在这里插入图片描述

客户应用带上Access Token访问用户数据:

在这里插入图片描述

资源服务器从请求中取出Access Token:

在这里插入图片描述

校验Access Token具有访问用户数据的权限:

在这里插入图片描述

校验Access Token具有访问用户数据的权限:

在这里插入图片描述

上面的流程中第一步是授权服务器生成Access Token, 在真实流程中,在颁发Token前先要征询用户同意:

在这里插入图片描述

首先客户应用请求Access Token:

在这里插入图片描述

授权服务器征询用户意见,是否将权限授予客户应用:

在这里插入图片描述

如果用户同意授权服务器颁发token:

在这里插入图片描述

授权服务器生成一个Access Token:

在这里插入图片描述

并将token颁发给客户应用:

在这里插入图片描述

注意黄色椭圆圈起来的部分:

在这里插入图片描述

OAuth 2.0标准化了Access Token的请求和响应部分, OAuth2.0的细节在RFC 6749(OAuth 2.0授权框架)中描述:

在这里插入图片描述

通过上面的描述,我们总结出了在OAuth2.0协议中存在四种角色:用户、客户端应用、资源服务器、授权服务器。你可能对这四种角色还是有点迷惑,不清楚它们之间的工作流程。没关系,下面通过一个形象化的例子来描述。

在使用 OAuth2 协议进行第三方授权登录(如使用 QQ 登录淘宝)的场景中,其四种角色之间的工作流程如图所示:
在这里插入图片描述
各个角色的定义如下:

  1. 资源拥有者(Resource Owner)
    资源拥有者是指拥有某些资源(如用户数据、服务访问权限等)的用户。在淘宝登录的例子中,资源拥有者就是想要登录淘宝的用户。他们拥有访问自己淘宝账户的权限,并且可以授权第三方应用(如 QQ )来代表他们访问这些资源。
  2. 客户端应用(Client Application)
    客户端应用是指希望获取资源访问权限的应用程序。在淘宝登录的例子中,淘宝网站或淘宝的移动应用就是客户端应用。它需要用户的授权才能访问用户的 QQ 账户信息,以便完成登录过程。
  3. 授权服务器(Authorization Server)
    授权服务器是负责处理授权请求并颁发访问令牌(Access Token)的服务器。在 QQ 登录淘宝的场景中,QQ 的服务器就是授权服务器。当用户同意授权后,QQ 的服务器会生成一个访问令牌,并将其提供给淘宝的客户端应用。
  4. 资源服务器(Resource Server)
    资源服务器是存储用户资源(如用户数据)的服务器,并根据访问令牌验证请求的合法性。在淘宝登录的例子中,淘宝的服务器就是资源服务器。它接收来自客户端应用的请求,验证附带的访问令牌,如果验证通过,则允许客户端应用访问用户的淘宝账户资源。

OAuth2 协议的流程

  1. 用户尝试使用 QQ 登录淘宝。
  2. 淘宝客户端应用引导用户到 QQ 的授权服务器。
  3. 用户在授权服务器上确认授权,允许淘宝访问其账户信息。
  4. 授权服务器验证用户身份后,生成一个访问令牌并返回给淘宝客户端应用。
  5. 淘宝客户端应用使用这个访问令牌向资源服务器(淘宝服务器)请求用户数据。
  6. 资源服务器验证访问令牌的有效性,如果有效,允许客户端应用访问用户数据,完成登录过程。

在这个过程中,OAuth2 协议确保了用户数据的安全,因为用户可以直接控制哪些应用可以访问他们的数据,而不需要共享他们的用户名和密码。

在上面的第二步骤中,淘宝客户端应用是如何引导用户到 QQ 的授权服务器呢?

在OAuth 2.0授权流程中,客户端应用(在这个场景中是淘宝)需要构造一个特定的URL来引导用户到授权服务器(QQ服务器)进行授权。这个URL包含了几个关键的查询参数,它们的值大多由客户端应用自己确定,但必须符合授权服务器的要求。下面是这些参数的来源和作用:

(1)response_type

  • 内容来源:由客户端应用指定。
  • 作用response_type参数指定了授权服务器应该返回给客户端应用的响应类型。在授权码流程中,这个值通常是code,表示客户端应用请求一个授权码。那么授权服务器在用户授权后会返回一个授权码(Authorization Code),客户端应用随后可以携带这个授权码来请求授权服务器颁发访问令牌(Access Token)。

(2)client_id

  • 内容来源:由授权服务器提供给客户端应用。
  • 作用client_id是客户端应用在注册时从授权服务器获取的唯一标识符。它告诉授权服务器是哪个客户端应用正在请求授权。在 OAuth 2.0 请求中,客户端应用需要提供这个标识符来证明自己的身份。

(3)redirect_uri

  • 内容来源:由客户端应用指定,并且这个redirect_uri必须与在授权服务器注册应用时提供的redirect_uri完全匹配。
  • 作用:这是授权服务器在授权流程结束后,发送用户代理(如浏览器)回到客户端应用的地址。授权服务器将在这个URI上附加授权码或错误信息。

如何理解“客户端应用指定的这个redirect_uri必须与在授权服务器注册应用时提供的redirect_uri完全匹配”?

答:客户端应用在授权服务器注册时会提供一个或多个redirect_uri,这些是客户端应用预先定义好的,授权服务器并不会自动生成这些URI。当客户端应用发起授权请求时,它会在请求中指定一个redirect_uri,这个URI必须是在注册应用时提供给授权服务器的其中之一。也就是说在注册时客户端应用会在授权服务器中提供一堆redirect_uri,但是在发起请求时客户端应用只会指定一个redirect_uri,那么这个redirect_uri就去那一堆redirect_uri中查询,找到匹配的那个redirect_uri即可。

可以用如下三个步骤理解:

  • 注册阶段:当你在授权服务器(如QQ)上注册你的应用(比如淘宝)时,你需要提供一些信息,包括应用名称、应用类型、以及一个或多个redirect_uri。这些redirect_uri是你控制的,用户在授权后将被重定向回的地址。例如,你可能提供https://taobao.com/callback作为一个redirect_uri
  • 授权请求阶段:当你的应用请求用户的授权时,你会构造一个请求URL,包括response_typeclient_idscope等参数,以及你打算使用的redirect_uri。这个redirect_uri必须是你在注册应用时提供给授权服务器的地址之一。例如,你的请求可能包含redirect_uri=https://taobao.com/callback。
  • 安全匹配:授权服务器(QQ)会检查请求中的redirect_uri是否与你注册应用时提供的redirect_uri之一完全匹配。如果不匹配,请求将被拒绝。这是一种安全措施,防止攻击者通过修改redirect_uri来拦截授权码或访问令牌。

(4)scope

  • 内容来源:由客户端应用指定。
  • 作用:定义客户端应用请求访问的权限范围。这些权限由授权服务器预先定义,客户端应用在请求时指定希望获得的权限范围。

然后我们再继续谈引导用户到QQ授权服务器进行授权

客户端应用(淘宝)通过将上述参数附加到授权服务器的授权端点URL上,构造一个完整的URL。然后,客户端应用将用户的浏览器重定向到这个URL。在实际操作中,这通常通过在客户端应用的UI中提供一个“使用QQ登录”的按钮来实现,当用户点击这个按钮时,客户端应用就会执行重定向操作。

举个例子:

假设淘宝客户端应用的client_id123456789,注册的redirect_urihttps://taobao.com/callback,并且希望请求profileemail的权限(scope)。淘宝客户端构造的URL可能如下:

https://graph.qq.com/oauth2.0/authorize?
response_type=code&
client_id=123456789&
redirect_uri=https%3A%2F%2Ftaobao.com%2Fcallback&
scope=profile+email

当用户访问这个URL时,他们将被引导到QQ的授权页面,页面上会显示淘宝请求的权限,并询问用户是否同意授权。如果用户同意,QQ授权服务器将用户重定向回淘宝网站的redirect_uri,并附加一个授权码。

总结来说,response_typeclient_idredirect_uriscope中的大部分内容是由客户端应用根据授权服务器的要求和客户端应用的需求自己生成的,除了client_id是由授权服务器预先分配给客户端应用的。通过构造包含这些参数的URL并引导用户访问,客户端应用可以启动OAuth 2.0授权流程。

下面我们再全面完整地来阐述OAuth 2.0 工作流程(以淘宝网站使用 QQ 登录为例):

  1. 用户尝试使用 QQ 登录淘宝:用户在淘宝网站上点击使用 QQ 登录按钮,淘宝客户端应用发起一个请求到 QQ 授权服务器。

  2. 请求授权:淘宝客户端应用构造一个包含 response_type(通常是 code)、client_id、redirect_uri 和 scope 的请求,引导用户到 QQ 授权服务器进行授权。

  3. 用户授权:用户在 QQ 授权服务器上确认授权,同意淘宝访问其 QQ 账户的特定权限(由 scope 指定)。

  4. 获取授权码:用户同意后,QQ 授权服务器会生成一个授权码,并使用 redirect_uri 将用户重定向回淘宝客户端应用。授权码作为查询参数附加在重定向的 URL 上。

  5. 请求访问令牌:淘宝客户端应用接收到授权码后,使用 client_id 和 client_secret(客户端应用的密钥)向 QQ 授权服务器发送请求,以获取访问令牌。

  6. 获取访问令牌:QQ 授权服务器验证请求的合法性(包括 client_id、client_secret 和授权码),如果验证通过,会返回访问令牌给淘宝客户端应用。

  7. 访问资源:淘宝客户端应用使用获取到的访问令牌向淘宝资源服务器请求用户数据。资源服务器验证访问令牌的有效性后,返回用户数据。

  8. 用户登录成功:淘宝客户端应用使用从资源服务器获取的数据完成用户的登录过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DDI中的自适应子结构

SA-DDI提出了一种子结构感知图神经网络,一种配备了子结构注意力机制和用于DDI预测的子结构-子结构交互模块(SSIM)的消息传递神经网络。具体而言,基于分子中官能团的尺寸和形状通常是不规则的化学直觉,子结构注意力被设…

大模型时代下做科研的四个思路【论文精读·52】

大家好,上个礼拜FacebookMetaAI刚刚开源了他们自己的一个语言的大模型,叫做LLAMA,这个LLAMA的模型有65billing的参数,效果自然是不错的。他们的目的也是想让这个大模型更加的亲民,能够让更多人拿到这个模型的参数&…

ClickHouse快速上手

简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS) 官网(https://clickhouse.com/docs/zh)给出的定义,其实没看懂 特性 ClickHouse支持一种基于SQL的声明式查询语言,它在许多情况下与ANSI SQL标准相同。使用时和MySQL有点相似&#…

加固平板电脑在无人机的应用|亿道三防onerugged

无人机技术的快速发展已经在许多领域展现出巨大潜力,而加固平板电脑的应用在无人机领域中扮演着重要角色。 首先,加固平板电脑在无人机探测设备中发挥着关键作用。无人机探测设备通常需要实时传输高清图像和数据,以支持各种监测、勘测和检测…

JAVA高并发——无锁与死锁

文章目录 1、与众不同的并发策略:比较交换2、无锁的线程安全整数:AtomicInteger3、Java中的指针:Unsafe类4、无锁的对象引用:AtomicReference5、带有时间戳的对象引用:AtomicStampedReference6、数组也能无锁&#xff…

Unity2023.1.19_ShaderGraph节点说明以及使用技巧

Unity2023.1.19_ShaderGraph节点说明以及使用技巧 目录 Unity2023.1.19_ShaderGraph节点说明以及使用技巧 1. 快捷键CtrlG完成和UE蓝图使用快捷键C一样的蓝图分组注释效果: 2. Tiling And Offset: 3. 以下是两组URP材质渲染的效果对比: 4…

JWT 重点讲解

JWT 重点讲解 文章目录 JWT 重点讲解1. JWT 是什么2. JWT 的组成2.1 第一部分 HEADER2.2 第二部分 PAYLOAD2.3 第三部分 SIGNATURE 3. JWT 在线生成与解析4. JWT 的特点4.1 无状态4.2 可自定义4.3 扩展性强4.4 调试性好4.5 安全性取决于密钥管理4.6 无法撤销4.7 需要缓存到客户…

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter:抽象类,实际开发中继承这个类并且重写相关方法,用得最多的一个Adapter! ArrayAdapter:支持泛型…

第五篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:详细解读pyttsx3的`preprocess_text`函数文本预处理。

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、pyttsx3的preprocess_text函数文本预处理基本用法示例代码二、实现更复杂的文本预处理逻辑示例代码三、去除停用词、词干提取示例代码四、词形还原、拼写纠正示例代码五、…

19-k8s的附加组件-coreDNS组件

一、概念 coreDNS组件:就是将svc资源的名称解析成ClusterIP; kubeadm部署的k8s集群自带coreDNS组件,二进制部署需要自己手动部署; [rootk8s231 ~]# kubectl get pods -o wide -A k8s系统中安装了coreDNS组件后,会有一个…

Linux(五)__系统管理

介绍 通常, Windows 中使用"任务管理器"主要有 3 个目的: 利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程;利用"性能"和"用户"标签来判断服务器的健康状态&#xff1…

国际章真厉害,离婚后仍带汪峰继女小苹果赴日滑雪。

♥ 为方便您进行讨论和分享,同时也为能带给您不一样的参与感。请您在阅读本文之前,点击一下“关注”,非常感谢您的支持! 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 在如今这个纷繁复杂的社会中,家庭关系和亲子关系的…

K8S | 全面解读CKA认证的重要性!

K8S认证工程师(CKA)备考与学习指南https://blog.csdn.net/XMWS_IT/article/details/133697915?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170849020616800182129977%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2…

在VS里使用C#制作窗口应用

新建项目 创建项目的时候搜索net,选择这个。 打开应该是这样 第一个控件 选择公共控件 - PictureBox - 拖入Form 在Image处选择上传本地资源,建议上传一个小一点的图片。 修改一下尺寸。 ctrls 保存 从“属性”切换到“事件” 双击Click事件…

学习并理解SQL注入问题

一、什么是sql注入 public class TestSql {public static void main(String[] args) {Scanner inScanner new Scanner(System.in);System.out.println("请输入用户名");String username inScanner.nextLine();System.out.println("请输入密码");String …

【RN】为项目使用React Navigation中的navigator

简言 移动应用基本不会只由一个页面组成。管理多个页面的呈现、跳转的组件就是我们通常所说的导航器(navigator)。 React Navigation 提供了简单易用的跨平台导航方案,在 iOS 和 Android 上都可以进行翻页式、tab 选项卡式和抽屉式的导航布局…

防御第六次作业-防火墙综合实验(av、url过滤、dns过滤)

目录 拓扑图: 要求: 8 9 10 11 拓扑图 要求 前7个要求在上一篇博客; 8.分公司内部的客户端可以通过域名访问到内部的服务器 9.假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件,内网的FTP服务器也需要…

安装unget包 sqlsugar时报错,完整的报错解决

前置 .net6的开发环境 问题 ? 打开unget官网,搜索报错的依赖Oracle.ManagedDataAccess.Core unget官网 通过unget搜索Oracle.ManagedDataAccess.Core查看该依赖的依赖 发现应该是需要的依赖Oracle.ManagedDataAccess.Core(>3.21.100)不支持.net6的环境 解…

加载arcgis切片服务网络请求有大量404错误

需求: 前端访问arcgis切片服务时,在网络请求中出现大量404(Not Found)错误,切片时设置了感兴趣区域,在感兴趣范围内请求切片时能够正常返回切片。 问题分析: 设置感兴趣区域切片的目的是减少站…

基于Mapbox展示GDAL处理的3D行政区划展示实践

目录 前言 一、Gdal数据处理 1、数据展示 2、Java数据转换 二、Mapbox可视化 1、定义Mapbox地图 2、地图初始化 3、创建地图 三、界面优化 1、区域颜色设置 2、高度自适应和边界区分 3、中文标注 总结 前言 最近有遇到一个需求,用户想在地图上把行政区划…