【Sa-Token】Demo OAuth2 授权码模式(静默授权)调用流程分析

news2024/11/23 8:00:30

文章目录

    • 前言
    • 参考目录
    • 测试 Demo
    • 调用流程分析
      • 调用流程说明
      • 源码分析
      • 0、启动项目
      • 1、步骤1:点击授权登录
      • 1.1、获取变量以及配置(路由分发的实现)
      • 1.2、获取客户端对象
      • 1.3、尝试授权(未登录)
      • 2、步骤2:输入账号密码登录
      • 2.1、登录请求校验
      • 3、步骤3:再次向服务端请求授权并获取 Code
      • 3.1、构建请求对象 `RequestAuthModel`
      • 3.2、重定向路径校验
      • 3.3、获取 Code
      • 3.4、组装重定向路径
      • 4、步骤4:使用 Code 获取 Access-Token
      • 4.1、校验参数
      • 4.2、构建 Access-Token
      • 5、请求成功

前言

好久没有更新,MyBatis 源码的书上周也看完了,但是没有想好要写什么内容(书里面讲得比较全面,感觉不知道该写什么哈哈哈) 。

框架【RuoYi-Vue-Plus】准备发布 5.X 版本了,基于JDK17Spring Boot 3.X,项目结构做了很大调整,也加入了简单的多租户功能,感兴趣的朋友可以去体验一下。

5.X 版本有考虑接入 OAuth 2 功能,仓库 Issue 也有相关说明。因为之前没有接触过相关的功能开发,因此以 Sa-TokenOAuth 2.0 的 Demo 为主进行学习,希望能够对这一功能有更深入的了解。

参考目录

  • Sa-Token 官方文档:Sa-Token-OAuth2.0 模块
  • OAuth 2.0 的四种方式 (by 阮一峰老师)

测试 Demo

本文使用的是 Sa-Token 最新版本 V1.34.0 的官方 Demo。

  • OAuth2-Server端: /sa-token-demo/sa-token-demo-oauth2-server/
  • OAuth2-Client端: /sa-token-demo/sa-token-demo-oauth2-client/

Demo 目录结构如下:

在这里插入图片描述

需要注意的是,Demo 中的数据是没有对数据库进行交互的,换句话说就是写死的,实际使用中需要根据需要从数据库中获取相关数据,在 Demo 中也有相关的注释说明。

调用流程分析

调用流程说明

OAuth 2.0 一共有四种方式,本文分析的是最常用的 授权码方式

如果看了参考目录里面的说明的话应该对下面这张图不陌生:

(截图自 Sa-Token 官方文档)
在这里插入图片描述

这是授权码方式的流程简图,经过 Debug 分析之后,我画了一张更贴近代码调用流程的图,可以根据这张图来分析 OAuth2 授权码模式。

在这里插入图片描述

先简单说明一下,调用流程可以划分为四个步骤,右边服务端入口方法都是同一个 SaOAuth2Handle#serverRequest,在方法内部进行了路由分发,根据不同的请求调用不同的处理方法,下面来看看 Debug 流程。

源码分析

0、启动项目

按照官方文档步骤启动项目,并打开测试页面。

在这里插入图片描述

这里面有不同的操作,上面流程图所描绘的是第一种静默授权的流程,理解了这个流程之后,下面三种方式都比较好理解,文本暂不展开。

1、步骤1:点击授权登录

这一步骤的请求是:

http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=http://sa-oauth-client.com:8002/ 

SaOAuth2ServerController#request
在这里插入图片描述

后续的步骤也是进入此方法处理。

SaOAuth2Handle#serverRequest
在这里插入图片描述

1.1、获取变量以及配置(路由分发的实现)

首先从 SaHolder 获取请求 Request 以及 Response 信息,当然也是经过了封装的增强对象。

SaHolderSa-Token 上下文持有类,将请求的信息封装在这个类里面。

在这里插入图片描述

SaOAuth2ConfigSa-TokenOAuth2 配置对象,Demo 里面对此进行了定制化的配置,在项目启动时就已经将配置信息初始化到了容器里面。

SaOAuth2ServerController#setSaOAuth2Config
在这里插入图片描述

除此之外还有默认配置。

在这里插入图片描述

不同的请求都封装在常量类 SaOAuth2Consts 里面。

在这里插入图片描述

判断请求信息,根据不同的请求做不同的处理,这就完成了路由分发的操作,配置信息则是用来进行授权。

SaOAuth2Handle#serverRequest 这个方法是将子方法归拢到了一个方法里面,如果想要分开处理的话,也可以在 Controller 里面根据不同的请求写不同的入口,并调用 SaOAuth2Handle 的方法进行处理。

1.2、获取客户端对象

根据上一步的判断,接下来是要获取 SaClientModel 对象。这一步需要根据请求中的参数 client_id 来获取,在 Demo 中给了一个简单的实现。

SaOAuth2Handle#currClientModel
在这里插入图片描述

SaOAuth2Util#checkClientModel
在这里插入图片描述

SaOAuth2Template#checkClientModel
在这里插入图片描述

SaOAuth2TemplateImpl#getClientModel
在这里插入图片描述

在这里插入图片描述

1.3、尝试授权(未登录)

在这里插入图片描述

SaOAuth2Handle#authorize
在这里插入图片描述

未登录页面的配置:

在这里插入图片描述

前端跳转至未登录页面。

2、步骤2:输入账号密码登录

前端登录页面:

在这里插入图片描述

输入账号密码后,请求的是:

http://sa-oauth-server.com:8001/oauth2/doLogin

2.1、登录请求校验

同样进入到 SaOAuth2Handle#serverRequest 方法。

在这里插入图片描述

SaOAuth2Handle#doLogin
在这里插入图片描述

获取登录函数 DoLoginHandle 对账号密码进行校验。

登录函数的配置如下:
在这里插入图片描述

在这里插入图片描述

登录成功之后,会再次请求 Code,也就是再次进入步骤 1 中的方法。

3、步骤3:再次向服务端请求授权并获取 Code

SaOAuth2Handle#authorize
在这里插入图片描述

在获取 Code 之前需要进行一系列的判断。前面未登录判断已经校验通过了,下面来简单说明一下其他判断步骤。

3.1、构建请求对象 RequestAuthModel

SaOAuth2Util#generateRequestAuth
在这里插入图片描述

SaOAuth2Template#generateRequestAuth
在这里插入图片描述

3.2、重定向路径校验

在这里插入图片描述

SaOAuth2Util#checkRightUrl
在这里插入图片描述

SaOAuth2Template#checkRightUrl
在这里插入图片描述

SaStrategy#hasElement
在这里插入图片描述

3.3、获取 Code

由于不是显式授权,也没有设置 Scope,因此判断步骤 4和5 暂且不进行说明。

在这里插入图片描述

然后来到获取 Code 步骤:
在这里插入图片描述

SaOAuth2Util#generateCode
在这里插入图片描述

SaOAuth2Template#generateCode
在这里插入图片描述

在这里插入图片描述

引用一下官方文档对于 Code 的说明:

Code授权码具有以下特点:
1.每次授权产生的Code码都不一样
2.Code码用完即废,不能二次使用
3.一个Code的有效期默认为五分钟,超时自动作废
4.每次授权产生新Code码,会导致旧Code码立即作废,即使旧Code码尚未使用

3.4、组装重定向路径

SaOAuth2Util#buildRedirectUri
在这里插入图片描述

SaOAuth2Template#buildRedirectUri
在这里插入图片描述

组装好路径之后就会进行页面重定向。

在这里插入图片描述

然后前端回到首页,并且使用 Code 码进行授权登录。

4、步骤4:使用 Code 获取 Access-Token

经过上一步骤之后获取了 Code,然后前端再根据 Code 请求获取 Access-Token。如果是显示授权,可以使用 Access-Token 可以获取到系统相关的用户信息等。

SaOAuthClientController#codeLogin
在这里插入图片描述

SaOAuth2Handle#serverRequest
在这里插入图片描述

SaOAuth2Handle#token
在这里插入图片描述

4.1、校验参数

SaOAuth2Util#checkGainTokenParam
在这里插入图片描述

SaOAuth2Template#checkGainTokenParam
在这里插入图片描述

4.2、构建 Access-Token

(Debug 时间太长导致 Code 失效了,所以这里 Code 和前面的不太一样,是重新请求之后的结果)

SaOAuth2Util#generateAccessToken
在这里插入图片描述

SaOAuth2Template#generateAccessToken
在这里插入图片描述

AccessTokenModel 对象:
在这里插入图片描述

构建完成,将 Access-Token 对象返回到前端。

在这里插入图片描述

5、请求成功

请求完成之后前端展示的内容:

在这里插入图片描述

(Debug 时间太长异步请求异常了,所以这里 Token 和前面的不太一样,是重新请求之后的结果)

至此完成了OAuth2 授权码模式(静默授权)调用流程的分析。

(完)

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

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

相关文章

深度探索存储与检索

一个数据库在最基础的层次上需要完成两件事情:当你把数据交给数据库时,它应当把数据存储起来;而后当你向数据库要数据时,它应当把数据返回给你。 作为程序员,为什么要关心数据库内部存储与检索的机理?你可…

生物识别技术是否可以成为应对安全挑战的最佳选择?

引言 随着科技的快速发展,人们对于个人信息安全和物质财富保护的需求越来越高。同时,在恐怖主义和犯罪活动日益增多的当下,各国政府也在积极探索新的安全保障手段。生物识别技术应运而生,其能够通过人体生理特征或行为模式进行身份…

Dynamics 365 自动化发布工具Spkl介绍

本篇主要是为了后面讲述CI/CD时用到的工具做一个说明,先奉上spkl的github地址,没听说过的可以去查看下,挺不错的工具。 我们主要用这个工具来部署WebResource, Plugin和Workflow Activities 以及后续的CI 首先从nuget上下载工具包&#xff0c…

SpringMVC访问JSP页面

1. 在spring-web中配置视图解析器 <!--3&#xff1a;配置JSP 显示ViewResolver--> <bean class"org.springframework.web.servlet.view.InternalResourceViewResolver"><property name"viewClass" value"org.springframework.web.ser…

【Python】PIL给图片添加水印最全代码解释

给图片添加水印 以下是一个添加水印的方法&#xff0c;你可以将其放在一个单独的 Python 文件中&#xff0c;然后在需要添加水印的地方调用该方法即可&#xff1a; from PIL import Image, ImageDraw, ImageFontdef add_watermark(image_path, text, font_path, font_size40,…

Redis 经典面试题合合集详解

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Cy7-COOH近红外菁染料CAS号1628790-40-8星戈瑞

CY7-COOH是一种红外荧光染料&#xff0c;其最大激发和发射波长分别为750nm和773nm。这种荧光染料分子具有较高的光稳定性和化学稳定性&#xff0c;可以在细胞和组织中长时间稳定地发光&#xff0c;因此应用于生命科学领域的荧光显微镜成像、生物传感和分析等方面。 产品名称&a…

深眸科技|工业3D视觉创新崛起,与2D视觉融合创建更高效解决方案

近年来&#xff0c;伴随着人工智能技术的进步&#xff0c;行业应用需求的提升&#xff0c;机器视觉技术持续升级。由于2D视觉技术难以满足精密制造行业不断提高的精度需求&#xff0c;能够更全面、更多维了解产品信息的3D视觉技术逐渐火热&#xff0c;并掀起浪潮。 据GGII数据…

西米支付:数字人民币接口来了!实时清算至数字人民币钱包。

1. 产品概述 什么是数字人民币&#xff1f; 是由中国人民银行发行的数字形式的法定货币&#xff0c;由指定运营机构参与运营&#xff0c;与实物人民 币等价&#xff0c;具有价值特征和法偿性&#xff0c;是一种零售型央行数字货币&#xff0c;也是未来主流支付方式之一&#…

楠姐技术漫话:图计算的那些事 | 京东云技术团队

不知道大家在平时的工作中 有没有听说过“图计算”这个名词 但大家一定在各工作汇报&#xff0c;技术分享中听说过“智能化”&#xff0c;“人工智能”这样的字眼 而我们今天要唠的这个图计算 就是人工智能领域内近几年炙手可热的前沿宠儿 也是我们风控反欺诈中常用的“大杀…

不会Elasticsearch标准查询语句,如何分析数仓数据?

1 Elasticsearch的查询语句 ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL,Query DSL是利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互&#xff0c;这种方式的丰富查询语法让ES检索变得更强大&#xff0c;更简洁。 1.1 查询预发 # GET /…

ChatGPT中文使用手册

简要介绍&#xff1a; First&#xff1a;什么是ChatGPT? ChatGPT是由OpenAI训练的一款大型语言模型&#xff0c;最新版为GPT3.5&#xff08;公开版&#xff09;和GPT4.0&#xff08;PLUS会员版本&#xff09; 它能够生成类似于人类写作的文本。您只需要给出提示或提出问题&…

ChatGPT实现游戏 NPC 对话

游戏 NPC 对话 玩游戏的一个必要过程&#xff0c;就是和 NPC 对话&#xff0c;领取任务&#xff0c;获取线索。有趣的游戏&#xff0c;会根据用户和 NPC 交流时的不同选择&#xff0c;触发不同剧情走向。甚至多个 NPC 之间还能有罕见的隐藏剧情&#xff0c;等待用户发掘。可以…

《PyTorch高级机器学习实战》包邮送书三本

目录 前言书籍目录抽奖方式 前言 随着人工智能和机器学习的蓬勃发展&#xff0c;相关算法和技术已经广泛运用到诸多行业&#xff0c;大量的研究者和各行业人员也投入机器学习的研究与开发中。 掌握高级机器学习算法原理&#xff0c;并能够根据不同情况实现灵活运用&#xff0…

NineData:高效高质量的Redis可视化管理工具

Redis 是一个内存数据结构存储系统&#xff0c;它被广泛用于缓存、队列、实时分析等多种应用场景中&#xff0c;目前已经成为 Key-value 数据存储系统中的佼佼者&#xff0c;根据 DB-Engine 网站提供的最新数据&#xff0c;Redis 在 Key-value stores 类别中排名第一&#xff0…

Dynamics 365 DevOps CI/CD之Solution

CI/CD到了Soution就没太多可说的了&#xff0c;按部就班配置就行&#xff0c;我选择的工具是Power DevOps Tool 1&#xff0c;首先下载工具&#xff0c;然后设置连接字符串去连环境&#xff0c;连接字符串还是用ClientSecret的形式 2&#xff0c;当然导出前还是要发布下自定义的…

小程序分包

分包加载的介绍 大部分小程序都会由某几个功能组成&#xff0c;通常这几个功能之间是独立的&#xff0c;但会依赖一些公共的逻辑&#xff0c;并且这些功能通常会对应某几个独立的页面。那么小程序代码的打包&#xff0c;大可不必一定要打成一个&#xff0c;可以按照功能的划分&…

c/c++ 宏定义里的#和##

工作中如果是c开发的话&#xff0c;经常会用到宏定义&#xff0c;而宏定义中的#和##也会时不时遇到&#xff0c;今天分享这两个符号的作用。 1&#xff0c;# -- 转换成字符串 直接看例子&#xff1a; #include <stdio.h> #include <stdlib.h>#define VAL2STR(VA…

vue非单文件组件的使用方法

标准化开发时的嵌套&#xff1a; 在实际开发中&#xff0c;通常会创建一个 APP 组件作为根组件&#xff0c;由这个根组件去管理其它的组件&#xff0c;而 Vue 实例只需要管理这个 APP 组件就行了。 <!DOCTYPE html> <html><head><meta charset"utf…

springboot+java办公用品租赁领用管理信息系统

将系统权限按管理员和员工这两类涉及员工划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;个人中心、员工管理、办公用品管理、领用申请管理、采购申请管理、物品分类管理、系统管理等功能。 (b)员工进入系统前台可以实现办公用品管理、领用申请管理…