Spring Security Oauth2 之 理解OAuth 2.0授权流程

2023-10-27

总览

本系列针对Security-Oauth2架构的剖析,包括:oauth2.0认证架构详解、架构源码解读、核心结构配置。

本篇是对oauth2认证流程的概述,喜欢的多多pick!

内容引用书籍:The OAuth 2.0 Authorization Framework

gitHub 链接: https://github.com/vincent9309/seurity-oauth2

1.1 角色

OAuth定义了四个角色:

资源所有者
一个能够授权访问受保护资源的实体。当资源所有者是一个人时,它被称为最终用户。
资源服务器
托管受保护资源的服务器能够使用访问令牌接受和响应受保护的资源请求。
客户
代表资源所有者及其授权的应用程序进行受保护的资源请求。术语客户端并不意味着任何特定的实现特征(例如,应用程序是在服务器,台式机还是其他设备上执行的)。
授权服务器
服务器在成功认证资源所有者并获得授权后向客户端发放访问令牌。

授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以是与资源服务器相同的服务器或独立的实体。一个授权服务器可能会发出多个资源服务器接受的访问令牌。

1.2 协议流程


图1中所示的抽象OAuth 2.0流程描述了四个角色之间的交互,并包含以下步骤:


(A)
客户端请求资源所有者的授权。授权请求可以直接给资源所有者(如图所示),或者优选间接地通过授权服务器作为中介。
(B)
客户端接收授权许可,这是一种代表资源所有者授权的凭证,使用本规范中定义的四种授权类型之一或使用扩展授权类型表示。授权授予类型取决于客户端用于请求授权的方法以及授权服务器支持的类型。
(C)
客户端通过向授权服务器进行认证并携带授权来请求访问令牌。
(D)
授权服务器对客户端进行身份验证并验证授权,并且如果有效则发出访问令牌。
(E)
客户端从资源服务器请求受保护的资源并通过携带访问令牌进行认证。
(F)
资源服务器验证访问令牌,并且如果有效,则为该请求提供服务。


客户从资源所有者(步骤(A)和(B)中描述)获得授权许可的首选方法是使用授权服务器作为中介

2 模式

oauth2根据使用场景不同,分成了4种模式
● 客户端模式(client credentials)
● 密码模式(resource owner password credentials)
● 授权码模式(authorization code)
● 简化模式(implicit)

Oauth基于客户端与认证服务器验证的能力定义了两种客户端类型(以及,维护客户端认证信息的能力): 客户端模式、密码模式。

基础参数定义:
grant_type (发放令牌类型)、
client_id (客户端标识id)
username(用户帐号)
password (用户密码)
client_secret(客户端标识密钥)
refresh_token (刷新令牌)
scope(表示权限范围,可选项)

2.1 客户端模式

 认证服务器给客户端下发客户端标识--一个代表了注册信息的唯一字符串。客户端标识不是秘密;它被暴露给资源拥有者,并且不能单独用来客户端验证。客户端标识对认证服务器来说是唯一的。

(A)客户端直接向认证服务器获取令牌介。

(B)认证服务器确认无误后,向客户端提供访问令牌。
(C) 客户端携带令牌访问资源端

常用于访问公共资源(无需登录):网站首页

该模式没有refresh_token,过期可以直接认证获取匿名令牌。

样例:

请求参数
grant_type:client_credentials
client_id:46582ae7217343a8b252e3977e7cc421
client_secret:cgGvf5Rotv7D76m9JaArfY3YG6fDec47

结果
{
"access_token": "9fae1382-8d9c-4c64-a01c-d67817137fd4",
"token_type": "bearer",
"expires_in": 27689,
"scope": "read write"
}

2.2 密码端模式

密码模式在客户端基础上,从用户方获取帐号密码,再访问授权服务器认证授权。

(A)客户端从用户方获取帐号密码。
(B)客户端携带用户信息向认证服务器获取令牌介。
(B)认证服务器确认无误后,向客户端提供访问令牌。

(c) 客户端携带令牌访问资源端

常用于访问个人资源(必须登录):个人资料

样例:

请求参数
grant_type:password
client_id:46582ae7217343a8b252e3977e7cc421
username:18565783136
password:AC1DAdo9ZcY4dKAdtyPRzoICWZlkR7WDgtO06S5fVCUS6A/67rMxeW+2mKKbo2N1FQ==
client_secret:cgGvf5Rotv7D76m9JaArfY3YG6fDec47

结果
{
"access_token": "41d74d86-bd30-4935-a6f1-c61614a1b72b",
"token_type": "bearer",
"refresh_token": "1ba402f7-394b-420b-9805-39578d6176f8",
"expires_in": 30063,
"scope": "read write"

}

2.3 授权码模式

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

(A)用户访问客户端,后者将前者导向认证服务器(一个获取授权的页面)。
(B)用户选择是否给予客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

常用于 第三方登录,例如:QQ登录网易音乐。

样例:

GET oauth-server/authorize?response_type=code&client_id=cgGvf5Rotv7D76m9JaArfY3YG6fDec47&state=userId
&redirect_uri=www.baidu.com

redirect_uri:表示重定向URL编码后的URI(第三方服务器)

state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。(常用:用户标识)

重定向:
www.baidu.com?code=SplxlOBeZQQYbYS6WxSbIA&state=userId

获取code
GET oauth-server/grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=www.baidu.com

结果
{
"access_token": "41d74d86-bd30-4935-a6f1-c61614a1b72b",
"token_type": "bearer",
"refresh_token": "1ba402f7-394b-420b-9805-39578d6176f8",
"expires_in": 30063,
"scope": "read write"

}

2.4 简化模式

不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,即没有code,直接返回令牌。

(A)客户端将用户导向认证服务器。
(B)用户决定是否给于客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。

(D)客户端(第三方服务器)获取到令牌。

样例:

GET oauth-server/authorize?response_type=token&client_id=cgGvf5Rotv7D76m9JaArfY3YG6fDec47&state=userId

&redirect_uri=www.baidu.com

重定向:

www.baidu.com?access_token=41d74d86-bd30-4935-a6f1-c61614a1b72b&state=userId

3 刷新令牌

当访问令牌过期时候,刷新重新获取令牌。

样例:

请求参数
grant_type:refresh_token
client_id:46582ae7217343a8b252e3977e7cc421
client_secret:cgGvf5Rotv7D76m9JaArfY3YG6fDec47
refresh_token:1ba402f7-394b-420b-9805-39578d6176f8


结果
{
"access_token": "6d8cffd1-a90e-4846-838f-176050ed49b4",
"token_type": "bearer",
"refresh_token": "1ba402f7-394b-420b-9805-39578d6176f8",
"expires_in": 43199,
"scope": "read write"
}

依赖

pom引入security-oauth2依赖

<dependency>
	<groupId>com.happylifeplat</groupId>
	<artifactId>security-crypto</artifactId>
	<version>1.0-RELEASE</version>
</dependency>


<dependency>
	<groupId>org.springframework.security.oauth</groupId>
	<artifactId>spring-security-oauth2</artifactId>
</dependency>

案例基于JdbcTokenStore,需要配置数据库

CREATE TABLE `oauth_access_token` (
  `authentication_id` varchar(128) NOT NULL COMMENT '身份验证ID',
  `token_id` varchar(128) DEFAULT NULL COMMENT '令牌ID',
  `token` blob COMMENT '令牌',
  `user_name` varchar(256) DEFAULT NULL COMMENT '用户名',
  `client_id` varchar(128) DEFAULT NULL COMMENT '客户端ID',
  `authentication` blob COMMENT '认证体',
  `refresh_token` varchar(256) DEFAULT NULL COMMENT '刷新令牌',
  PRIMARY KEY (`authentication_id`),
  KEY `PK_token_id` (`token_id`) USING BTREE,
  KEY `PK_refresh_token` (`refresh_token`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `oauth_approvals` (
  `userId` varchar(128) DEFAULT NULL,
  `clientId` varchar(128) DEFAULT NULL,
  `scope` varchar(256) DEFAULT NULL,
  `status` varchar(10) DEFAULT NULL,
  `expiresAt` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `lastModifiedAt` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;

CREATE TABLE `oauth_client` (
  `id` varchar(128) NOT NULL COMMENT '客户端id',
  `name` varchar(256) DEFAULT NULL COMMENT '客户端名称',
  `disabled` bit(1) NOT NULL DEFAULT b'0',
  `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户端表';

CREATE TABLE `oauth_client_details` (
  `client_id` varchar(128) NOT NULL COMMENT '客户端id',
  `resource_ids` varchar(256) DEFAULT NULL COMMENT '客户端所能访问的资源id集合',
  `client_secret` varchar(256) DEFAULT NULL COMMENT '客户端访问密匙',
  `scope` varchar(256) DEFAULT NULL COMMENT '客户端申请的权限范围',
  `authorized_grant_types` varchar(256) DEFAULT NULL COMMENT '授权类型',
  `web_server_redirect_uri` varchar(256) DEFAULT NULL COMMENT '客户端重定向URI',
  `authorities` varchar(256) DEFAULT NULL COMMENT '客户端权限',
  `access_token_validity` int(11) DEFAULT NULL COMMENT 'access_token的有效时间(单位:秒)',
  `refresh_token_validity` int(11) DEFAULT NULL COMMENT 'refresh_token的有效时间(单位:秒)',
  `additional_information` varchar(4096) DEFAULT NULL COMMENT '预留字段,JSON格式',
  `autoapprove` varchar(256) DEFAULT NULL COMMENT '否自动Approval操作',
  PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户端详情';

CREATE TABLE `oauth_client_token` (
  `authentication_id` varchar(128) NOT NULL COMMENT '身份验证ID',
  `token_id` varchar(128) DEFAULT NULL COMMENT '令牌ID',
  `token` blob COMMENT '令牌',
  `user_name` varchar(256) DEFAULT NULL COMMENT '用户名',
  `client_id` varchar(256) DEFAULT NULL COMMENT '客户端ID',
  PRIMARY KEY (`authentication_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `oauth_code` (
  `code` varchar(256) DEFAULT NULL,
  `authentication` blob,
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `oauth_refresh_token` (
  `token_id` varchar(128) DEFAULT NULL COMMENT '令牌ID',
  `token` blob COMMENT '令牌',
  `authentication` blob COMMENT '认证体',
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1539 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `oauth_resource` (
  `id` varchar(128) NOT NULL,
  `name` varchar(256) DEFAULT NULL,
  `alias` varchar(256) DEFAULT NULL,
  `describe` varchar(256) DEFAULT NULL,
  `disabled` bit(1) NOT NULL DEFAULT b'0',
  `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='资源表';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security Oauth2 之 理解OAuth 2.0授权流程 的相关文章

  • 【编写高质量代码:改善Java程序的151个建议】第9章:多线程和并发___建议125~131

    建议125 优先选择线程池 建议126 适时选择不同的线程池来实现 Java线程池原理及实现 建议127 lock与synchronized是不一样的 直接上代码 package OSChina Multithread import jav
  • selenium:select下拉框

    以下两种导的包没有任何本质区别 ui包就是调用Select包中的select方法 from selenium webdriver support select import Select from selenium webdriver su
  • Excel 数据透视表如何累积求和?

    选择数据区域 插入数据透视表 将 区域 与 组别 分别拖放至 行 将 销售数量 分两次拖放至 值 字段 设置计算类型为 求和 如图所示 选择第二个 销售数量 鼠标右键单击后 在弹出的快捷菜单中依次选择 值显示 按某一字段汇总 选项 在弹出的
  • java进阶篇--Docker 有什么优点?使用时需要注意什么问题?

    Docker 从 2013 年发展到现在 它的普及率已经可以和最常用的 MySQL 和 Redis 并驾齐驱了 从最初偶尔出现在面试中 到现在几乎成为面试中必问的问题之一 如果再不了解 Docker 相关的知识点 可能就会与自己心仪的职位擦
  • LSTM的加速算法:QRNN和SRU

    LSTM介绍及加速原理 LSTM的公式可以表示如下所示 其中分别表示输入门 输出门 遗忘门 对LSTM还不熟悉的同学可以先阅读 理解LSTM网络或者直接阅读Christopher Olah 的原博文 Understanding LSTM N
  • 第一周工作周报-5

    部 门 理工大学 姓 名 邓辉波 入 职 时 间 7 18 本周已完成工作内容及总结 1 学习了HTML CSS的基础知识 2 学习了Photoshop的一些简单的知识 3 完成了javascript的第一部分内容的学习 4 制作了第一张静
  • ThinkPHP6 API开发前后端分离用户信息保存在后端的方法

    今天在做项目的时候有一个问题就是Session在开发API的情况下官方是不推荐用的 那么问题来了 用户信息怎么保存呢 下面来记录一下我的写法 首先我用的是JWT插件对token进行生成及验证 话不多说 撸起袖子搞起来 首先写登录文件 我的文
  • layui的弹框弹框不自动关闭

    前言 layui的弹框相比较vue的来说 用法是有很多不一样的 官方 layui弹框 layui弹框2 实现效果 一级弹框点击X 后 不关闭一级弹框 弹出二级弹框 实现代码 核心不退出代码 函数里面加了 return false 1级弹框方
  • 常用排序算法哪个效率更高之从理论到实践

    前面整理了一篇关于排序算法的基础类库 基本排序算法类SortHelper 这里我们来看看这几个算法哪个效率更高一点呢 1 先从理论来看看这几个算法 1 冒泡排序法 基本思想 两两比较待排序数据元素的大小 发现两个数据元素的次序相反时即进行交
  • 【机器学习实战】9、利用K-means算法对未标注数据分组

    文章目录 10 1 K 均值聚类算法 10 2 使用后处理来提高聚类性能 10 3 二分K 均值算法 10 4 总结 簇识别 簇识别给出了聚类结果的含义 假定有一些数据 簇识别会告诉我们这些簇到底都是些什么 聚类与分类的区别 分类的目标事先
  • mavoneditor 显示html,mavonEditor

    mavonEditor 基于Vue的markdown编辑器 example 图片展示 PC Install mavon editor 安装 npm install mavon editor save Use 如何引入 index js 全局
  • CSS基础-position: absolute绝对定位的默认位置

    绝对定位position的值为absolute时的默认位置 前言 今天上午练习定位时发现了这么一个东西 元素设置为绝地定位后不给它添加top时是正常的我想要的结果 添加top后还需要精确的计算 正文 感觉你也应该开始好奇默认值是啥了 来一起
  • Windows下使用AcroRd32.exe(Adobe Acrobat Reader)打开PDF文件

    以下命令用于打开路径名为filename的PDF文件 acroRd32 exe filename 以下命令用于打开路径名为filename的PDF文件 并直接翻到第x页 acroRd32 exe a page x filename 例如 将

随机推荐

  • [记录]_运行.exe提示缺少MSVCP140_1.dll文件的解决办法

    在安装完成PySide2之后 点运行designer exe 总是提示缺少MSVCP140 1 dll文件 根据网上说法 是要去 https support microsoft com zh cn help 2977003 the late
  • Tensorboard的基本使用

    文章目录 一 一个简单例子 二 组件介绍 三 栏目介绍 3 0 graphs 3 1 scalars 3 2 images 3 3 audio 3 4 histograms 3 5 distributions 3 6 projector 3
  • Android Studio 工具:Lint 代码扫描工具(含自定义lint)

    转载 https www jianshu com p a0f28fbef73f 什么是 Lint Android Lint 是 SDK Tools 16 ADT 16 开始引入的一个代码扫描工具 通过对代码进行静态分析 可以帮助开发者发现代
  • django+xadmin 在线教育网站(三)

    在此之前我们已成功的使用xadmin将后台管理系统搭建起来了 接下来 开始我们后台的功能处理 首先是登录功能 登录功能 1 把html文件中index html和login html拷贝到templates文件夹内 2 新建static目录
  • 分布式流水号生成器

    引用http stor 51cto com art 201711 558600 htm的最终方案实现 使用数据库自增id 作为序列 使用支持多个服务 1 使用 REPLACE INTO SEQUENCE GENERATOR TABLE st
  • 详解TCP如何确保可靠传输(确认应答,重传机制,滑动窗口,流量控制)

    TCP确保可靠传输的机制 TCP协议格式 TCP的可靠传输 检验和 确认应答 序列号 重传机制 超时重传 RTO超时时间设置 快速重传 选择确认 SACK D SACK 滑动窗口 窗口大小 流量控制 窗口关闭 探测 糊涂窗口综合症 累计确认
  • 计算机技术应用广泛以下属于科学计算方面,2016年12月计算机二级MSoffice选择题习题...

    2016年12月计算机二级MSoffice选择题习题 计算机等级考试要取得好成绩平时一定要多加练习 提高做题技巧和速度 下面是小编为大家整理的2016年12月计算机二级MSoffice选择题习题 希望对大家有帮助 选择题 1 一棵二叉树中共
  • 前端面试官会问的问题

    前言 面试的多了才会发现面试官问的也就是那几个问题 因为面试后面有技术审核员 所以面试的时候专业知识占少部分 大部分是看你这个人怎么样 下面我总结了下对面试的经验 1 自我介绍 2 工作经历 3 现居地 4 实习了多久 5 第一家公司多少人
  • 算法设计-回溯法——装载问题

    算法介绍 回溯法 回溯法又称试探法 回溯法的基本做法是深度优先搜索 是一种组织得井井有条的 能避免不必要重复搜索的穷举式搜索算法 回溯算法的基本思想 从一条路往前走 能进则进 不能进则退回来 换一条路再试 问题实例 问题描述 题目 用回溯法
  • 杭电计算机考研(初试+复试)经验分享

    GitHub KolinHuang 个人博客 KolHuang Blog 欢迎交流 写在前头 离复试结束已经快半个月了 现在才想起来写这么一篇经验贴 供广大考研人参考参考 本人报考的是杭州电子科技大学的计算机专硕 本科专业是物联网 算半个跨
  • fiddler抓包第一课--手机数据抓包

    以前有学过fiddler 但是也只是安装下软件 听了一节课 没实际用过的东西 只是似懂非懂 昨天开发让我测手机APP 因为有一个原因选择不出来 问了前端 说需要抓包 问我会不会 我刚想开口说不会 但是 我突然想到 这不就是实践和学习的机会嘛
  • sqoop-export

    Sqoop工具模块之sqoop export 一 介绍 该export工具将一组文件从HDFS导入RDBMS 目标表必须已经存在于数据库中 根据用户指定的分隔符读取输入文件并将其解析为一组记录 1 模式 sqoop export有三种模式
  • DC综合基本概念:all_register -clock $clock_name

    综合中抓取某个时钟下所有的sink pin或者sink dff 可以使用 抓出所有的sink dff all register clock clock name 抓出所有sink dff 的clock pin foreach in coll
  • python的学习心得

    因为疫情 2020年寒假有点长 估计大部分人在家都憋坏了 人总是闲不住的 想要搞点事 于是我又捡起了那本 利用python进行数据分析 发现都能看懂 但是自己还没写过一个像样的程序 不写一个程序 总觉着有点遗憾 于是开启了一个全新的世界 既
  • SptringBoot第三讲(SpringBoot配置文件之properties application. properties)

    在Spring Boot中已经给创建好的application properties 中创建如下 server port 8081 idea使用的是utf 8 在Setting File Encodings utf 8 后边打上对号 配置p
  • 汇编中有符号与无符号数的区分

    origin http blog chinaunix net uid 28458801 id 3576608 html 转载自 http hi baidu com asmsky blog item 7290d20076cab6da277fb
  • python3+requests接口自动化--ddt数据驱动

    DDT包含类的装饰器ddt和两个方法装饰器data 直接输入测试数据 file data 可以从json或者yaml中获取测试数据 只有yaml和yml结尾的文件以yaml形式上传 其他情况下默认为json 通常情况下 data中的数据按照
  • JDBC连接数据库(查询)的步骤

    简单的应用例子 先导入jar包 代码 import java sql Connection import java sql DriverManager import java sql ResultSet import java sql SQ
  • SDL介绍及下载

    1 简介 SDL Simple DirectMedia Layer 是一套开放源代码的跨平台多媒体开发库 使用C语言写成 SDL提供了数种控制图像 声音 输出入的函数 让开发者只要用相同或是相似的代码就可以开发出跨多个平台 Linux Wi
  • Spring Security Oauth2 之 理解OAuth 2.0授权流程

    总览 本系列针对Security Oauth2架构的剖析 包括 oauth2 0认证架构详解 架构源码解读 核心结构配置 本篇是对oauth2认证流程的概述 喜欢的多多pick 内容引用书籍 The OAuth 2 0 Authorizat