【Spring Boot 集成应用】 OAUTH2统一认证单点登录中的各种模式说明

news/2024/5/16 20:30:23/文章来源:https://blog.csdn.net/hxx688/article/details/127028397
1. OAUTH2统一认证介绍

OAuth 2.0 是一个行业的标准授权协议。OAuth 2.0 专注于简化客户端开发人员,同时为 Web 应用程序,桌面应用程序,手机等各种设备接入提供特定的授权流程。

2. 传统登陆认证

传统登陆方式是在每个服务进行登陆认证, 每个服务保存自己的用户数据, 并独立实现登陆认证逻辑。

随着服务的不断扩展, 用户数据很难集中统一,开发成本不断增加, 用户交互也极为不便 。

在这里插入图片描述

3. 单点登陆认证

单点登陆是通过统一认证授权服务, 完成所有服务节点的登陆授权工作。
在这里插入图片描述

只需一台认证服务器,统一用户数据库, 完成用户认证授权, 控制资源访问, 支持其他服务或第三方应用接入, 扩展性强, 开发和运维成本降低。

4. OAuth2角色
  • resource owner : 资源所有者,具备访问该资源的实体, 如果是某个人, 被称为end-user。
  • resources server: 资源服务器,受保护的资源服务器, 具备提供资源能力, 如订单服务, 商品服务等。
  • client: 客户端,这并不是指用户, 而是对资源服务器发起请求的应用程序,比如前后分离项目, 前端服务访问管理接口, 访问后台业务功能接口。
  • authorization server: 授权服务器, 能够给客户端颁发令牌, 这个就是我们上面所讲的统一认证授权服务器。
  • user-agent: 用户代理, 作为资源所有者与客户端沟通的工具, 比如APP, 浏览器等。
5. OAuth2 协议流程

在这里插入图片描述

  1. Resource Owner 与 Client 之间 , 资源所有者向Client发起认证请求, Client再返回认证授权信息。

  2. Client 收到 Resource Owner 的认证请求后, 会去Authorization Server 申请访问令牌, Authorization Server会让Client 进行认证, 通过之后会返回Access Token。

  3. Client 拿到 Authorization Server 的 Acceess Token , 访问Resource Server,Resource Server 验证之后, 返回被保护的资源信息。

  4. Resource Server 可以通过JWT在本地进行验证, 也可以访问 Authorization Server, 对Client 的请求的合法性进行验证。

6. 授权类型

OAuth2 分为四种授权类型, 分别为:

  • Authorization Code(授权码模式):授权码模式, 通过授权码获取token进行资源访问。
  • Implicit(简化模式):用于移动应用程序或 Web 应用程序,这种模式比授权码模式少了code环节,回调url直接附带token。
  • Resource Owner Password Credentials(密码模式):资源所有者和客户端之间具有高度信任时(例如,客户端是设备的操作系统的一部分,或者是一个高度特权应用程序, 比如APP, 自研终端等),因为client可能存储用户密码。
  • Client Credentials(客户端模式):该模式直接根据client端的id和密钥即可获取token, 不需要用户参与, 适合内部的API应用服务使用。
7. 授权码模式流程

在这里插入图片描述

  1. 资源拥有者(用户)通过代理(WEB浏览器)访问客户端程序,发起授权码模式认证。

  2. 客户端(Client,比如CSDN论坛)向认证服务器(Auth Server,QQ账号认证服务)发起请求, 此时客户端携带了客户端标识(client_id, 标识来源是CSDN)和重定向地址(redirect_uri, 一般是CSDN的地址)。

  3. 用户确认授权,客户端(Client)接收到code。

  4. 在重定向的过程中,客户端拿到 code 与 client_idclient_secret 去授权服务器请求令牌,整个过程,用户代理是不会拿到令牌 token 的。

  5. 客户端(Client)拿到令牌 token 后就可以向第三方的资源服务器请求资源了, 比如获取QQ基本资料, 头像等信息。

授权请求:

response_type=code           // 必选项
&client_id={客户端的ID}       // 必选项 
&redirect_uri={重定向URI}    // 可选项 
&scope={申请的权限范围}        // 可选项
&state={任意值}              // 可选项

授权响应参数:

code={授权码}          // 必填
&state={任意文字}       // 如果授权请求中包含 state的话那就是必填

令牌请求:

grant_type=authorization_code      // 必填
&code={授权码}                     // 必填 必须是认证服务器响应给的授权码
&redirect_uri={重定向URI}          // 如果授权请求中包含 redirect_uri 那就是必填
&code_verifier={验证码}            // 如果授权请求中包含 code_challenge 那就是必填

令牌响应:

"access_token":"{访问令牌}",      // 必填"token_type":"{令牌类型}",      // 必填"expires_in":{过期时间},        // 任意"refresh_token":"{刷新令牌}",   // 任意"scope":"{授权范围}"            // 如果请求和响应的授权范围不一致就必填
8. 简化模式
     +----------+| Resource ||  Owner   ||          |+----------+^|(B)+----|-----+          Client Identifier     +---------------+|         -+----(A)-- & Redirection URI --->|               ||  User-   |                                | Authorization ||  Agent  -|----(B)-- User authenticates -->|     Server    ||          |                                |               ||          |<---(C)--- Redirection URI ----<|               ||          |          with Access Token     +---------------+|          |            in Fragment|          |                                +---------------+|          |----(D)--- Redirection URI ---->|   Web-Hosted  ||          |          without Fragment      |     Client    ||          |                                |    Resource   ||     (F)  |<---(E)------- Script ---------<|               ||          |                                +---------------++-|--------+|    |(A)  (G) Access Token|    |^    v+---------+|         ||  Client ||         |+---------+
  1. 资源拥有者(用户)通过代理(WEB浏览器)访问客户端程序,发起简化模式认证。
  2. 客户端(Client)向认证服务器(Auth Server)发起请求, 此时客户端携带了客户端标识(client_id)和重定向地址(redirect_uri)。
  3. 客户端(Client)拿到令牌 token 后就可以向第三方的资源服务器请求资源了。

授权请求:

response_type=code           // 必选项
&client_id={客户端的ID}       // 必选项 
&redirect_uri={重定向URI}    // 可选项 
&scope={申请的权限范围}        // 可选项
&state={任意值}              // 可选项

授权响应参数:

&token_type={令牌类型}     // 必填
&expires_in={过期时间}       // 任意
&state={任意文字}            // 如果授权请求中包含 state 那就是必填
&scope={授权范围}            // 如果请求和响应的授权范围不一致就必填

为什么要有授权码和简化模式?看完这两种模式, 可能会有些疑问, 为什么要这么麻烦, 直接一次请求返回TOKEN不就可以吗?

可以看出, 两者主要差别, 是少了code验证环节, 直接返回token了, code验证是客户端与认证服务器在后台进行请求获取, 代理是获取不到TOKEN的, 如果缺少这个环节, 直接返回TOKEN, 相当于直接暴露给所有参与者, 存在安全隐患, 所以简化模式,一般用于信赖度较高的环境中使用。

9. 密码模式
     +----------+| Resource ||  Owner   ||          |+----------+v|    Resource Owner(A) Password Credentials|v+---------+                                  +---------------+|         |>--(B)---- Resource Owner ------->|               ||         |         Password Credentials     | Authorization || Client  |                                  |     Server    ||         |<--(C)---- Access Token ---------<|               ||         |    (w/ Optional Refresh Token)   |               |+---------+                                  +---------------+
  1. 资源拥有者直接通过客户端发起认证请求。
  2. 客户端提供用户名和密码, 向认证服务器发起请求认证。
  3. 认证服务器通过之后, 客户端(Client)拿到令牌 token 后就可以向第三方的资源服务器请求资源了。

令牌请求:

grant_type=password       // 必填
&username={用户ID}    // 必填
&password={密码}    // 必填
&scope={授权范围}       // 任意

令牌响应:

"access_token":"{访问令牌}",   // 必填
"token_type":"{令牌类型}",      // 必填
"expires_in":"{过期时间}",        // 任意
"refresh_token":"{刷新令牌}", // 任意
"scope":"{授权范围}"              // 如果请求和响应的授权范围不一致就必填

此模式简化相关步骤, 直接通过用户和密码等隐私信息进行请求认证, 认证服务器直接返回token, 这需要整个环境具有较高的安全性。

10. 客户端模式
     +---------+                                  +---------------+|         |                                  |               ||         |>--(A)- Client Authentication --->| Authorization || Client  |                                  |     Server    ||         |<--(B)---- Access Token ---------<|               ||         |                                  |               |+---------+                                  +---------------+
  1. 此模式最为简单直接, 由客户端直接发起请求。
  2. 客户端与服务器信赖度较高, 服务端根据请求直接认证返回token信息。
  3. 客户端(Client)拿到令牌 token 后就可以向第三方的资源服务器请求资源了。

这种模式一般在内部服务之间应用, 授权一次, 长期可用, 不用刷新token。

令牌请求:

grant_type=client_credentials     // 必填
&scope={授权范围}               // 任意

令牌响应:

"access_token":"{访问令牌}",   // 必填
"token_type":"{令牌类型}",      // 必填
"expires_in":"{过期时间}",        // 任意
"scope":"{授权范围}"              // 如果请求和响应的授权范围不一致就必填

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

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

相关文章

mqtt报文逐条解析

文章目录1、背景说明2、mqtt报文解析3、剩余长度计算4、构建connect报文5、CONNACK报文示例6、心跳PING报文7、心跳回应PINGRESP报文8、断开连接DISCONNECT报文9、订阅请求SUBSCRIBE10、订阅请求确认SUBACK11、取消订阅UNSUBSCRIBE12、取消订阅确认UNSUBACK13、发布消息PUBLISH…

element-ui源码分析:剖析el-tree源码,看看实现一个树组件有多么复杂(1)

elment-ui中tree木块相关文件如下图&#xff1a; 下图梳理一下各个文件之间的引用关系&#xff08;箭头的方向表示使用&#xff09; 1 uti.js 1.1 markNodeData 标记节点 export const NODE_KEY $treeNodeId;export const markNodeData function(node, data) {if (!data ||…

java集合专题Set接口及HashSet/LinkedHashSet使用方法底层结构及源码分析

Set接口及常用方法 我们主要学习Set接口下的HashSet/TreeSet/LinkedHashSet这3个Set的实现类! 并且通过源码的方式学习其底层结构分析源码和他们的扩容方式! Set特点: 无序,保存顺序和取出顺序不一致不允许重复值, 可以保存null值! Set接口下的常用方法 Set接口实现了Collec…

307. 区域和检索 - 数组可修改

文章目录分析常规做法线段树解法与其结构线段树的构建线段树的区域查询线段树的更新线段树的时间复杂度拓展阅读分析 原题油管讲解线段树做法 常规做法 brute force的做法是&#xff0c;更新时直接在数组原地更新&#xff0c;而求区域和时逐元素相加&#xff0c;时间复杂度为…

多测师肖sir_高级讲师_第2个月第8讲解类

Python中的类与对象 &#xff08;1&#xff09;类(class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对 象所共有的属性和方法。对象是类的实例。 案例&#xff1a;人类xiu&#xff08;对象&#xff09; &#xff08;2&#xff09;实例化&#xff1a;创…

使用docker-compose搭建高可用Apollo配置中心

使用docker-compose搭建高可用Apollo配置中心搭建学习环境编写docker-compose脚本创建script目录&#xff0c;并导入sql脚本执行docker-compose创建容器初始化环境创建测试应用启动demo&#xff0c;测试拉取配置添加依赖添加配置应用配置启动如下搭建高可用生产环境搭建mysql创…

Rosjava SLAM - Android APP 历程

目标 能在有一个Android APP的界面控制机器运行。 如&#xff1a;转&#xff1a; 机器人控制 &#xff1a; SLAM - Android APP_Lan.W的博客-CSDN博客如果选择&#xff0c;按下录制按钮时相机流将按照设置要求打开&#xff0c;相机流预览窗口将实时显示相机画面&#xff0c;得…

虚拟实习项目技术架构mal总结

mogodb闪退 各种插件和启动 mall文档 先要敲定技术架构版本才能编写代码,否则可能全部重来。 1.先技术2.再业务 先给请求加以及生成的token oauth2源码分析 教程

89-JavaIO流(概述、分类、体系)、字节输入和输出流(使用、案例-文件拷贝)

IO流 一、概述 IO流也称为输入、输出流&#xff0c;就是用来读写数据的。 比如我们玩过的消消乐游戏&#xff0c;这个游戏需要将分数展示出来给玩家看&#xff0c;当玩家的下一次分数超过上一次分数的时候&#xff0c;需要将新分数存到内存中&#xff0c;这就是数据的读写操作…

决策树、Hunt算法、泛化定理

决策树——Hunt’s algorithm&#xff08;贪心&#xff09; 红色语句加上后减轻过拟合&#xff0c;下边的GINI系数解决 Hunt’s algorithm 第五行如何寻找最好的划分方法 GINI Index 1减训练集S中yes占比和no占比的平方和&#xff0c;取值范围0-0.5 GINI(S)1−(py2pn2)GINI(S…

实验一:SDN

实验1:SDN拓扑实践 一、实验目的能够使用源码安装Mininet; 能够使用Mininet的可视化工具生成拓扑; 能够使用Mininet的命令行生成特定拓扑; 能够使用Mininet交互界面管理SDN拓扑; 能够使用Python脚本构建SDN拓扑。二、实验环境 Ubuntu 20.04 Desktop amd64 三、实验要求 (…

StarUML工具

StarUML工具 1、提示弹框Unregistered Version StartUML一直提示Unregistered Version解决 2、网格背景\白色背景 切换 快捷键&#xff1a;CTRLG 3、DevTools设置中文 打开DevTools&#xff0c;点击右上角设置图片&#xff0c;preferences中Language设置&#xff08;Ver…

Linux操作系统----终端设备和进程

补充终端设备1 控制台 /dev/ttyn2. 伪终端pty(pseudo-tty)3. 串口终端进程 process进程与程序之间的差异进程与程序子进程和父进程进程类型进程管理任务管理 Job Control任务管理命令终端设备 终端是一种字符型设备&#xff0c;通常使用tty来简称各种类型的终端设备&#xff0…

MATLAB | MATLAB中绘图的奇淫技巧合集

一些离大谱的绘图小技巧&#xff0c;部分内容来自https://undocumentedmatlab.com/ 更改3D坐标区轴位置 对于hAxesgca hAxes.XRuler.FirstCrossoverValue X轴在Y轴上的位置hAxes.XRuler.SecondCrossoverValue X轴在Z轴上的位置hAxes.YRuler.FirstCrossoverValue Y轴在X轴…

高等数值计算方法第一章引论【误差,条件数】

引论误差的来源与分类&#xff08;主要讨论的是后两个&#xff09;模型误差观测(测量)误差截断误差&#xff08;算法误差&#xff09;舍入误差绝对误差、相对误差与有效数字绝对误差e和误差限ε相对误差e~r~与相对误差限ε~r~有效数字误差定性分析与避免误差伤害算法的稳定性病…

中创新航拟10月6日上市:天齐锂业与小鹏汽车为基石投资者

雷递网 雷建平 9月23日中创新航科技股份有限公司&#xff08;简称&#xff1a;“中创新航”&#xff0c;股票代码&#xff1a;03931&#xff09;今日开启路演&#xff0c;发行区间为38港元到51港元&#xff0c;拟发行2.658亿股H股。假设发售价为每股发售股份44.5港元并假设超额…

关于我的vsc不能远程debug这件事

问题描述 vsc点击debug python file之后 出现大约一秒就消失了&#xff0c;什么也没发生&#xff0c;运行了个寂寞的感觉 打开vsc扩展中的Python扩展&#xff0c;在说明中看到这样一句话 但是我的远程服务器上anacodna python环境是3.6 (至于为啥我的版本这么旧是因为之前做本…

et文件丢失怎么恢复?5种恢复方法轻松掌握

et文件丢失怎么恢复呢&#xff1f;后缀名/扩展名是et的文件属于金山办公软件WPSOffice里的电子表格文件&#xff0c;打开方法很简单&#xff0c;可以用WPS Office打开&#xff0c;也可以用Microsoft Office的excel表格打开&#xff0c;而有时候我们在使用电脑或其他存储介质中会…

Python算法:决策树分类

Python算法&#xff1a;决策树分类 文章目录Python算法&#xff1a;决策树分类一、前言二、决策树算法原理介绍1、决策树原理2、决策树构造3、交叉验证三、决策树算法函数介绍1、 train_test_split函数2、tree.DecisionTreeClassifier函数四、数据说明五、编写Python决策树程序…

康耐视InSight相机与西门子PLC关于Profinet通讯说明

1.准备&#xff1a; 硬件&#xff1a; 康耐视 InSight-8402 智能相机西门子S7-1200 PLC电脑 软件&#xff1a; Cognex In-Sight Explorer西门子 TIA Portal 软件 组态文件&#xff1a; 相机的组态文件位于In-Sight Explorer软件安装目录下&#xff1a;Factory Protocol D…