【OAuth2系列】如何使用OAuth 2.0实现安全授权?详解四种授权方式

  作者:后端小肥肠

🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案

🍊 有疑问可私信或评论区联系我。

🥑  创作不易未经允许严禁转载。

姊妹篇:

【OAuth2系列】集成微信小程序登录到 Spring Security OAuth 2.0_spring security 微信小程序登录-CSDN博客

【OAuth2系列】Spring Cloud Gateway 作为OAuth2 Client接入第三方单点登录代码实践_spring gateway oauth2 client-CSDN博客

【Spring Security系列】5 次密码错误触发账号锁定?Spring Security 高效实现方案详解_springsecurity5.7.6自定义密码错误策略-CSDN博客

【Spring Security系列】10分钟实现 SpringSecurity + CAS 完美单点登录方案_spring-security-cas-CSDN博客

【Spring Security系列】如何用Spring Security集成手机验证码登录?五分钟搞定!_springsecurity短信验证码登录-CSDN博客

【Spring Security系列】基于Spring Security实现权限动态分配之菜单-角色分配及动态鉴权实践_spring secrity权限角色动态管理-CSDN博客

【Spring Security系列】基于Spring Security实现权限动态分配之用户-角色分配_spring security 角色-CSDN博客

【Spring Security系列】权限之旅:SpringSecurity小程序登录深度探索_spring security 微信小程序登录-CSDN博客

【Spring Security系列】Spring Security+JWT+Redis实现用户认证登录及登出_spring security jwt 退出登录-CSDN博客

目录

1. 前言

2. 什么是OAuth2?

3. OAuth 2.0 的授权方式应用场景

4.OAuth2.0中四种授权方式

4.1. 授权码模式

4.2. 简化模式

4.3. 密码模式

4.4. 客户端模式 

5. OAuth2.0中表结构说明 ​

5.1. oauth_client_details【核心表】

5.2. oauth_client_token

5.3. oauth_access_token

5.4. oauth_refresh_token

5.5. oauth_code

6. 结语

7. 参考链接


1. 前言

随着互联网的快速发展,用户数据的安全性和隐私保护变得尤为重要。为了解决第三方应用在访问用户资源时可能出现的安全问题,OAuth 2.0 成为当前最广泛使用的授权协议。它提供了一种安全、开放、标准化的方式,允许用户授权第三方应用访问其资源,而无需暴露敏感的账户信息。无论是常见的社交登录(如微信、Google 登录),还是系统间的安全对接,OAuth 2.0 都为现代应用程序提供了强大的支持。

在本文中,我们将全面解析 OAuth 2.0 的授权机制和应用场景,包括常用的四种授权方式以及相关的数据库表结构设计。通过实际的例子和详细的流程分析,希望能够帮助开发者快速掌握 OAuth 2.0 的核心概念和实现方法。

2. 什么是OAuth2?

OAuth 2.0 — OAuth

OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的规范标准。与以往的授权方式不同之处是OAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAuth 是开放的安全的,业界提供了 OAuth 的多种实现,如 Java、PHP、Ruby 等各种语言开发包,大大节约了程序员的时间,因而OAuth是简易的。很多大公司如 阿里、腾讯、 Google,Yahoo,Microsoft等都提供了 OAuth 认证服务,这些都足以说明 OAuth 标准逐渐成为开放资源授权的标准。OAuth 协议1.0版本过于复杂,目前发展到2.0版本,2.0版本已得到广泛应用。

3. OAuth 2.0 的授权方式应用场景

在实际开发中,OAuth 2.0 提供了灵活的授权机制,可以满足多种场景需求。为了更好地说明其使用方式,我们以一个在线教育平台为例,探讨 OAuth 2.0 的实际应用。

假设某在线教育平台需要整合第三方服务(如微信、钉钉、腾讯会议等),以实现以下功能:

  • 学生通过微信授权登录并绑定学习日程到腾讯日历;
  • 教师使用钉钉账号快速登录教学管理工具,查看课程安排和学员信息;
  • 平台自动对接腾讯会议,为线上课堂创建和管理视频会议。

OAuth 2.0 在这个场景中可以帮助平台完成以下任务:

  1. 用户授权第三方访问资源
    学生希望将自己的学习日程同步到腾讯日历,但又不希望直接向平台提供腾讯账号和密码。通过 OAuth 2.0,学生可以在平台中点击“同步到腾讯日历”,系统跳转到腾讯的授权页面,学生登录并授权后,平台获取一个访问令牌。之后,平台通过访问令牌与腾讯日历 API 交互,完成学习日程的同步。

  2. 快速实现身份验证
    教师可以通过 OAuth 2.0 快速登录教学管理工具,无需专门注册在线教育平台的账号。例如,教师点击“使用钉钉登录”,系统会跳转到钉钉的授权页面进行身份验证。在教师授权后,钉钉返回一个访问令牌,平台据此确认用户身份并分配相应的权限(如查看课程安排、学员列表等)。

  3. 系统间安全对接
    在线教育平台需要与腾讯会议集成,以便为线上课堂创建视频会议。在这种系统对系统的交互中,OAuth 2.0 的客户端模式(Client Credentials Grant)可以实现平台和腾讯会议 API 的安全通信。平台通过提供自身的客户端凭据(如 Client ID 和 Client Secret)获取访问令牌,然后使用该令牌通过腾讯会议的接口完成会议的创建、更新或删除等操作。

通过以上场景可以看出,OAuth 2.0 的授权机制在平台中可以灵活适配,从学生的日程同步到教师的快速登录,再到系统间的安全对接,均能确保数据的安全性和访问的便利性。

4.OAuth2.0中四种授权方式

OAuth2.0 的授权方式一共有四种:

授权码模式(Authorization Code):功能最完整,流程最严密的授权模式。国内各大服务提供商(微信、QQ、微 博、淘宝 、百度)都采用此模式进行授权。可以确定是用户真正同意授权;而且令牌是认证服务器发放给第三方应用的服务器,而不是浏览器上。

简化模式(Implicit): 令牌是发放给浏览器的,oauth客户端运行在浏览器中 ,通过JS脚本去申请令牌。而不是发放给第三方应用的服务器。

密码模式(Resource Owner Password Credentials):将用户名和密码传过去,直接获取 access_token 。用户同意授权动作是在第三方应用上完成 ,而不是在认证服务器上。第三方应用申请令牌时,直接带着用户名密码去向 认证服务器申请令牌。这种方式认证服务器无法断定用户是否真的授权了,用户名密码可能是第三方应用盗取来 的。

客户端证书模式(Client credentials):用得少。当一个第三应用自己本身需要获取资源(而不是以用户的名 义),而不是获取用户的资源时,客户端模式十分有用。

4.1. 授权码模式

授权码模式是 OAuth 2.0 中一种常见的授权方式,适用于需要高度安全性、后端服务器参与的场景。以下是以 第三方网站 为例,结合流程图详细说明授权码模式的工作原理:

流程步骤

  1. 用户访问第三方网站资源并请求登录
    用户打开 第三方网站,尝试访问某些需要用户登录授权的资源。此时,系统会引导用户跳转到认证服务器(如微信认证服务器)。

  2. 跳转到认证服务器进行登录
    第三方网站 检测到用户未登录后,会将用户跳转到认证服务器(如微信认证服务器)的登录页面,要求用户进行身份验证。

  3. 用户登录并授权
    用户在认证服务器的页面完成登录操作后,认证服务器会向用户展示授权请求页面,说明 第三方网站 需要访问哪些权限(如获取用户的基本信息)。用户确认授权后,认证服务器记录授权并生成一个授权码

  4. 认证服务器返回授权码
    授权码是一个临时的短期凭证,认证服务器会将其附带在用户跳转回 第三方网站 时的重定向 URI 中,并将其发送到 第三方网站 的客户端。

  5. 第三方网站使用授权码请求令牌
    第三方网站 的后端服务器拿到授权码后,会向认证服务器的令牌接口发送请求,并附上自身的 Client IDClient Secret 以验证身份。

  6. 认证服务器返回访问令牌
    认证服务器验证授权码和客户端身份后,向 第三方网站 返回访问令牌(Access Token)。访问令牌是访问用户资源的凭证。

  7. 第三方网站使用令牌获取用户信息
    第三方网站 使用访问令牌向资源服务器(如微信资源服务器)发起请求,获取用户的授权资源(如用户基本信息)。

  8. 资源服务器返回用户信息
    资源服务器验证令牌合法性后,返回用户的授权信息(如用户名、邮箱等)给 第三方网站

  9. 登录完成并显示用户信息
    第三方网站 获取到用户信息后,将其存储在会话中,视为登录成功,并向用户显示相关信息。

授权码模式的特点

  • 高安全性授权码仅在短时间内有效,访问令牌只会在后端服务器存储,前端无法直接接触到敏感数据。
  • 适用场景适用于 Web 应用或需要后端支持的场景,例如需要与外部服务整合的复杂应用。
  • 分工明确前端负责引导用户登录授权,后端负责安全存储和使用访问令牌。

4.2. 简化模式

简化模式(Implicit Grant)是一种适用于 无后端支持 的客户端应用(如单页面应用,SPA)的授权方式。访问令牌直接返回给客户端,用于访问用户的资源。以下以 第三方单页面应用 为例,解析简化模式的流程。

流程步骤

  1. 用户访问单页面应用并请求登录
    用户打开 第三方单页面应用,尝试访问需要授权的资源(例如用户个人信息、数据等)。

  2. 跳转到认证服务器进行登录
    应用检测到用户未登录,会将用户引导至认证服务器的授权页面。此时,应用会携带 Client ID 和重定向 URI 等参数,表明这是一个授权请求。

  3. 用户登录并授权
    用户在认证服务器的页面完成登录操作后,系统会展示一个授权请求页面,说明单页面应用需要的权限范围(例如访问用户信息)。用户确认授权后,认证服务器会生成一个访问令牌(Access Token)

  4. 认证服务器直接返回访问令牌
    认证服务器将访问令牌附带在重定向 URI 的哈希片段中,直接返回给单页面应用的前端客户端。例如:

    https://example.com/callback#access_token=xyz123&token_type=bearer&expires_in=3600
  5. 单页面应用提取访问令牌并存储
    前端应用从重定向 URI 中提取出访问令牌(通常通过 JavaScript 处理),并将其存储在内存中或短期存储中(如浏览器的 sessionStorage)。

  6. 使用访问令牌请求资源服务器
    单页面应用使用访问令牌向资源服务器发起请求,获取用户的授权数据(如用户名、头像等)。

  7. 资源服务器返回授权数据
    资源服务器验证令牌合法性后,返回用户的授权数据给单页面应用。

  8. 完成登录并显示用户信息
    单页面应用根据返回的数据更新界面,显示用户的登录信息和授权内容。

简化模式的特点

  1. 无后端参与令牌直接发送到客户端,适用于纯前端应用(如 SPA)。
  2. 快速响应减少了后端交互的步骤,用户体验流畅。
  3. 安全性低访问令牌暴露在前端,容易被拦截或盗用,建议配合以下措施:
    • 通过 HTTPS 确保传输安全。
    • 将令牌存储在短期存储(如 sessionStorage)中,而非长期存储(如 localStorage)。
    • 配合短期有效的令牌(如令牌有效期为 1 小时以内)。

4.3. 密码模式

密码模式(Resource Owner Password Credentials Grant)允许用户直接将用户名和密码提供给客户端,以获取访问令牌。它的安全性较低,一般仅在高度信任的环境中使用,比如内部系统。以下以 第三方网站的管理系统 为例,解析密码模式的流程。

流程步骤

  1. 用户在客户端输入凭据

    用户打开客户端应用(如第三方内部管理系统),并输入用户名和密码尝试登录。

  2. 客户端将凭据发送至认证服务器

    客户端应用将用户输入的 用户名 密码,连同自身的 Client ID Client Secret,通过后台请求发送到认证服务器。

    请求参数示例

    POST /oauth/token HTTP/1.1 Host: auth-server.com Content-Type: application/x-www-form-urlencoded grant_type=password username=user123 password=pass123 client_id=client_id_example client_secret=client_secret_example
  3. 认证服务器验证凭据

    认证服务器接收到请求后,会:

    1. 验证 用户名 密码 是否正确。
    2. 检查 Client ID Client Secret 是否有效。
    3. 如果所有验证通过,则生成一个访问令牌(Access Token)。
  4. 认证服务器返回访问令牌

    验证通过后,认证服务器返回访问令牌(Access Token)给客户端。

    返回示例

    { "access_token": "xyz123", "token_type": "bearer", "expires_in": 3600 }
  5. 客户端使用令牌请求资源服务器

    客户端携带访问令牌,向资源服务器发起请求,获取用户的授权数据或受保护的资源。

    请求示例

    GET /userinfo HTTP/1.1 Host: resource-server.com Authorization: Bearer xyz123
  6. 资源服务器返回授权数据

    资源服务器验证令牌的合法性后,返回用户授权的资源(如用户信息或操作权限)。

  7. 完成授权流程并展示数据

    客户端接收到用户数据后,展示相关内容(如登录成功后的用户信息)。

密码模式的特点

  • 用户凭据直接暴露客户端需要直接存储用户名和密码,安全性较低。
  • 适用场景适用于内部应用或高度信任的场景,如内部管理系统。
  • 不推荐用于公开的客户端应用建议仅在无法避免的情况下使用。

4.4. 客户端模式 

客户端模式(Client Credentials Grant)用于服务之间的授权,不涉及用户参与。典型场景是服务端之间的通信,例如后台服务器与第三方 API 的对接。以下以 第三方网站资源服务器 的对接为例,解析客户端模式的流程。

流程步骤

  1. 第三方网站向认证服务器发起请求
    第三方网站 的后台服务器向认证服务器发送请求,附带自身的 Client IDClient Secret

  2. 认证服务器验证客户端身份
    认证服务器验证客户端的 Client ID Client Secret 是否正确,确认客户端的合法性。

  3. 认证服务器返回访问令牌
    验证通过后,认证服务器向 第三方网站 返回访问令牌(Access Token)。

  4. 第三方网站使用访问令牌访问资源服务器
    第三方网站 使用获取的访问令牌向资源服务器发起请求,获取所需的资源或数据(如服务状态、统计数据等)。

  5. 资源服务器返回授权数据
    资源服务器验证令牌合法性后,返回请求的数据给 第三方网站

客户端模式的特点

  • 无用户参与直接在服务之间完成授权,令牌只在后台使用。
  • 适用场景服务对服务的交互,例如后台系统调用 API、任务自动化。
  • 安全性高凭据和令牌存储在服务器端,减少了被窃取的风险。

5. OAuth2.0中表结构说明 ​

建表语句 :

/*
SQLyog Ultimate v12.08 (64 bit)
MySQL - 8.0.16 : Database - security_authority
*********************************************************************
*/
​
​
/*!40101 SET NAMES utf8 */;
​
/*!40101 SET SQL_MODE=''*/;
​
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Table structure for table `oauth_access_token` */
​
DROP TABLE IF EXISTS `oauth_access_token`;
​
CREATE TABLE `oauth_access_token` (
  `token_id` varchar(255) DEFAULT NULL,
  `token` longblob,
  `authentication_id` varchar(255) DEFAULT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  `client_id` varchar(255) DEFAULT NULL,
  `authentication` longblob,
  `refresh_token` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
/*Data for the table `oauth_access_token` */
​
/*Table structure for table `oauth_approvals` */
​
DROP TABLE IF EXISTS `oauth_approvals`;
​
CREATE TABLE `oauth_approvals` (
  `userId` varchar(255) DEFAULT NULL,
  `clientId` varchar(255) DEFAULT NULL,
  `scope` varchar(255) DEFAULT NULL,
  `status` varchar(10) DEFAULT NULL,
  `expiresAt` datetime DEFAULT NULL,
  `lastModifiedAt` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
/*Data for the table `oauth_approvals` */
​
/*Table structure for table `oauth_client_details` */
​
DROP TABLE IF EXISTS `oauth_client_details`;
​
CREATE TABLE `oauth_client_details` (
  `client_id` varchar(255) NOT NULL,
  `resource_ids` varchar(255) DEFAULT NULL,
  `client_secret` varchar(255) DEFAULT NULL,
  `scope` varchar(255) DEFAULT NULL,
  `authorized_grant_types` varchar(255) DEFAULT NULL,
  `web_server_redirect_uri` varchar(255) DEFAULT NULL,
  `authorities` varchar(255) DEFAULT NULL,
  `access_token_validity` int(11) DEFAULT NULL,
  `refresh_token_validity` int(11) DEFAULT NULL,
  `additional_information` varchar(255) DEFAULT NULL,
  `autoapprove` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
/*Data for the table `oauth_client_details` */
​
/*Table structure for table `oauth_client_token` */
​
DROP TABLE IF EXISTS `oauth_client_token`;
​
CREATE TABLE `oauth_client_token` (
  `token_id` varchar(255) DEFAULT NULL,
  `token` longblob,
  `authentication_id` varchar(255) DEFAULT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  `client_id` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
/*Data for the table `oauth_client_token` */
​
/*Table structure for table `oauth_code` */
​
DROP TABLE IF EXISTS `oauth_code`;
​
CREATE TABLE `oauth_code` (
  `code` varchar(255) DEFAULT NULL,
  `authentication` varbinary(2550) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
/*Data for the table `oauth_code` */
​
/*Table structure for table `oauth_refresh_token` */
​
DROP TABLE IF EXISTS `oauth_refresh_token`;
​
CREATE TABLE `oauth_refresh_token` (
  `token_id` varchar(255) DEFAULT NULL,
  `token` longblob,
  `authentication` longblob
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
​
/*Data for the table `oauth_refresh_token` */
​
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
​

5.1. oauth_client_details【核心表】

字段名字段说明
client_id主键,必须唯一,不能为空. 用于唯一标识每一个客户端(client); 在注册时必须填写(也可由服务 端自动生成). 对于不同的grant_type,该字段都是必须的. 在实际应用中的另一个名称叫 appKey,与client_id是同一个概念.
resource_ids客户端所能访问的资源id集合,多个资源时用逗号(,)分隔,如: “unity-resource,mobile- resource”. 该字段的值必须来源于与security.xml中标签?oauth2:resource-server的属性 resource-id值一致. 在security.xml配置有几个?oauth2:resource-server标签, 则该字段可以 使用几个该值. 在实际应用中, 我们一般将资源进行分类,并分别配置对应 的?oauth2:resource-server,如订单资源配置一个?oauth2:resource-server, 用户资源又配置 一个?oauth2:resource-server. 当注册客户端时,根据实际需要可选择资源id,也可根据不同的 注册流程,赋予对应的资源id.
client_secret用于指定客户端(client)的访问密匙; 在注册时必须填写(也可由服务端自动生成). 对于不同的 grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appSecret,与client_secret是 同一个概念.
scope指定客户端申请的权限范围,可选值包括read,write,trust;若有多个权限范围用逗号(,)分隔,如: “read,write”. scope的值与security.xml中配置的?intercept-url的access属性有关系. 如?intercept-url的配置为?intercept-url pattern="/m/**" access=“ROLE_MOBILE,SCOPE_READ”/>则说明访问该URL时的客户端必须有read权限范 围. write的配置值为SCOPE_WRITE, trust的配置值为SCOPE_TRUST. 在实际应该中, 该值一 般由服务端指定, 常用的值为read,write.
authorized_grant_types指定客户端支持的grant_type,可选值包括 authorization_code,password,refresh_token,implicit,client_credentials, 若支持多个 grant_type用逗号(,)分隔,如: “authorization_code,password”. 在实际应用中,当注册时,该字 段是一般由服务器端指定的,而不是由申请者去选择的,最常用的grant_type组合有: “authorization_code,refresh_token”(针对通过浏览器访问的客户端); “password,refresh_token”(针对移动设备的客户端). implicit与client_credentials在实际中 很少使用.
web_server_redirect_uri客户端的重定向URI,可为空, 当grant_type为authorization_code或implicit时, 在Oauth的流 程中会使用并检查与注册时填写的redirect_uri是否一致. 下面分别说明:当 grant_type=authorization_code时, 第一步 从 spring-oauth-server获取 'code’时客户端发 起请求时必须有redirect_uri参数, 该参数的值必须与 web_server_redirect_uri的值一致. 第 二步 用 ‘code’ 换取 ‘access_token’ 时客户也必须传递相同的redirect_uri. 在实际应用中, web_server_redirect_uri在注册时是必须填写的, 一般用来处理服务器返回的code, 验证 state是否合法与通过code去换取access_token值.在spring-oauth-client项目中, 可具体参考 AuthorizationCodeController.java中的authorizationCodeCallback方法.当 grant_type=implicit时通过redirect_uri的hash值来传递access_token值. 如:http://localhost:7777/spring-oauth-client/implicit#access_token=dc891f4a-ac88- 4ba6-8224-a2497e013865&token_type=bearer&expires_in=43199然后客户端通过JS等从 hash值中取到access_token值.
authorities指定客户端所拥有的Spring Security的权限值,可选, 若有多个权限值,用逗号(,)分隔, 如: "ROLE_
access_token_validity设定客户端的access_token的有效时间值(单位:秒),可选, 若不设定值则使用默认的有效时间 值(60 * 60 * 12, 12小时). 在服务端获取的access_token JSON数据中的expires_in字段的值 即为当前access_token的有效时间值. 在项目中, 可具体参考DefaultTokenServices.java中属 性accessTokenValiditySeconds. 在实际应用中, 该值一般是由服务端处理的, 不需要客户端 自定义.refresh_token_validity 设定客户端的refresh_token的有效时间值(单位:秒),可选, 若不设定值则使用默认的有效时间值(60 * 60 * 24 * 30, 30天). 若客户端的grant_type不包 括refresh_token,则不用关心该字段 在项目中, 可具体参考DefaultTokenServices.java中属 性refreshTokenValiditySeconds. 在实际应用中, 该值一般是由服务端处理的, 不需要客户端 自定义.
additional_information这是一个预留的字段,在Oauth的流程中没有实际的使用,可选,但若设置值,必须是JSON格式的 数据,如:{“country”:“CN”,“country_code”:“086”}按照spring-security-oauth项目中对该字段 的描述 Additional information for this client, not need by the vanilla OAuth protocol but might be useful, for example,for storing descriptive information. (详见 ClientDetails.java的getAdditionalInformation()方法的注释)在实际应用中, 可以用该字段来 存储关于客户端的一些其他信息,如客户端的国家,地区,注册时的IP地址等等.create_time 数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
archived用于标识客户端是否已存档(即实现逻辑删除),默认值为’0’(即未存档). 对该字段的具体使用请 参考CustomJdbcClientDetailsService.java,在该类中,扩展了在查询client_details的SQL加上 archived = 0条件 (扩展字段)
trusted设置客户端是否为受信任的,默认为’0’(即不受信任的,1为受信任的). 该字段只适用于 grant_type="authorization_code"的情况,当用户登录成功后,若该值为0,则会跳转到让用户 Approve的页面让用户同意授权, 若该字段为1,则在登录后不需要再让用户Approve同意授权 (因为是受信任的). 对该字段的具体使用请参考OauthUserApprovalHandler.java. (扩展字 段)
autoapprove设置用户是否自动Approval操作, 默认值为 ‘false’, 可选值包括 ‘true’,‘false’, ‘read’,‘write’. 该 字段只适用于grant_type="authorization_code"的情况,当用户登录成功后,若该值为’true’或 支持的scope值,则会跳过用户Approve的页面, 直接授权. 该字段与 trusted 有类似的功能, 是 spring-security-oauth2 的 2.0 版本后添加的新属性. 在项目中,主要操作 oauth_client_details表的类是JdbcClientDetailsService.java, 更多的细节请参考该类. 也可 以根据实际的需要,去扩展或修改该类的实现.

作用

  • 存储 OAuth2 客户端(Client) 的基本信息,如 client_id client_secret,是所有授权过程的基础配置。
  • 用于定义每个客户端的权限范围(scope)、授权模式(grant_type)、重定向 URI 等信息。
  • 决定客户端可以访问哪些资源(resource_ids)、令牌有效期、以及是否需要用户授权(autoapprove)。

5.2. oauth_client_token

字段名字段说明
create_time数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
token_id从服务器端获取到的access_token的值.
token这是一个二进制的字段, 存储的数据是OAuth2AccessToken.java对象序列化后的二进制数据.
authentication_id该字段具有唯一性, 是根据当前的username(如果有),client_id与scope通过MD5加密生成的. 具体实现请参考DefaultClientKeyGenerator.java类.
user_name登录时的用户名
client_id

作用

  • 存储客户端特定的访问令牌(token)及其相关信息。
  • 用于客户端使用特定的 access_token 访问资源服务器时快速验证。

5.3. oauth_access_token

字段名字段说明
create_time数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
token_id从服务器端获取到的access_token的值.
token这是一个二进制的字段, 存储的数据是OAuth2AccessToken.java对象序列化后的二进制数据.
authentication_id该字段具有唯一性, 是根据当前的username(如果有),client_id与scope通过MD5加密生成的. 具体实现请参考DefaultClientKeyGenerator.java类.
user_name登录时的用户名
client_id
authentication存储将OAuth2Authentication.java对象序列化后的二进制数据.
refresh_token该字段的值是将refresh_token的值通过MD5加密后存储的. 在项目中,主要操作oauth_access_token表的对象是JdbcTokenStore.java. 更多的细节请参考该类

作用:

  • 存储 访问令牌(Access Token) 及其关联的身份验证信息。
  • 用于用户访问资源服务器时,验证 access_token 的合法性和有效期。

5.4. oauth_refresh_token

字段名字段说明
create_time数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
token_id该字段的值是将refresh_token的值通过MD5加密后存储的.
token存储将OAuth2RefreshToken.java对象序列化后的二进制数据
authentication存储将OAuth2RefreshToken.java对象序列化后的二进制数据

作用

  • 存储 刷新令牌(Refresh Token),用于在访问令牌过期后重新获取新的令牌。
  • oauth_access_token 表配合使用,提供令牌刷新机制。

5.5. oauth_code

字段名字段说明
create_time数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
code存储服务端系统生成的code的值(未加密).
authentication存储将AuthorizationRequestHolder.java对象序列化后的二进制数据.

作用:

  • 存储 授权码(Authorization Code),在授权码模式中,code 是客户端用来交换访问令牌的临时凭据。
  • 授权码模式特有的表,用于记录生成的 code 和相关的身份验证信息。

6. 结语

OAuth 2.0 作为现代应用开发中重要的授权机制,为用户与第三方应用之间提供了安全可靠的授权方式。从授权码模式到简化模式,再到密码模式和客户端模式,每种方式都能灵活适配不同场景需求。通过合理选择授权模式并结合安全措施(如 HTTPS 和短期令牌),可以有效保障用户数据的安全性。希望本文能够帮助开发者快速理解 OAuth 2.0 的核心概念和实现,为构建安全可靠的应用提供指导。

7. 参考链接

数据库表说明(oauth.ddl) 

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

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

相关文章

鸿蒙MPChart图表自定义(六)在图表中绘制游标

在鸿蒙开发中,MPChart 是一个非常强大的图表库,它可以帮助我们创建各种精美的图表。今天,我们将继续探索鸿蒙MPChart的自定义功能,重点介绍如何在图表中绘制游标。 OpenHarmony三方库中心仓 一、效果演示 以下是效果演示图&…

《新概念模拟电路》-电流源电路

电流源电路 本系列文章主要学习《新概念模拟电路》中的知识点。在工作过程中,碰到一些问题,于是又翻阅了模电这本书。我翻阅的是ADI出版的,西安交通大学电工中心杨建国老师编写的模电书。 本文主要是基于前文《新概念模拟电路》-三极管的基础…

Java实现下载excel模板,并实现自定义下拉框

GetMapping("excel/download")ApiOperation(value "模板下载")public void getUserRecordTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream response.getOutputStream();InputStream…

C 实现植物大战僵尸(四)

C 实现植物大战僵尸(四) 音频稍卡顿问题,用了 SFML 三方库已优化解决 安装 SFML 资源下载 https://www.sfml-dev.org/download/sfml/2.6.2/ C 实现植物大战僵尸,完结撒花(还有个音频稍卡顿的性能问题,待…

回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、方法概述 CNN-BiLSTM-Attention多输入单输出回归预测方法旨在通过融合CNN的局…

Ansible之批量管理服务器

文章目录 背景第一步、安装第二步、配置免密登录2.1 生成密钥2.2 分发公钥2.3 测试无密连接 背景 Ansible是Python强大的服务器批量管理 第一步、安装 首先要拉取epel数据源,执行以下命令 yum -y install epel-release安装完毕如下所示。 使用 yum 命令安装 an…

让css设置的更具有合理性

目录 一、合理性设置宽高 二、避免重叠情况,不要只设置最大宽 三、优先使用弹性布局特性 四、单词、数字换行处理 五、其他编码建议 平常写css时,除了遵循一些 顺序、简化、命名上的规范,让css具有合理性也是重要的一环。 最近的需求场…

【微服务】1、引入;注册中心;OpenFeign

微服务技术学习引入 - 微服务自2016年起搜索指数持续增长,已成为企业开发大型项目的必备技术,中高级java工程师招聘多要求熟悉微服务相关技术。微服务架构介绍 概念:微服务是一种软件架构风格,以专注于单一职责的多个响应项目为基…

设计模式 结构型 组合模式(Composite Pattern)与 常见技术框架应用 解析

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。通过这种模式,客户端可以一致地处理单个对象和对象组合。 在软件开发中,我们经常会遇到处理对象的层…

抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验

一、简介 KingbaseES 是中国人大金仓信息技术股份有限公司自主研发的一款通用关系型数据库管理系统(RDBMS)。 作为国产数据库的杰出代表,它专为中国市场设计,广泛应用于政府、金融、能源、电信等关键行业,以高安全性…

Linux驱动开发(17):输入子系统–电阻触摸驱动实验

有关电阻触摸的基础知识内容可以参考野火STM32相关教程,这里只介绍电阻触摸驱动的相关内容。与一般的微处理器 不同,本节使用的imx6ull内自带触摸屏控制器,只需要把电阻触摸屏的信号线接到对应的IO即可,通过配置imx6ull 触摸屏控制…

8、RAG论文笔记(Retrieval-Augmented Generation检索增强生成)

RAG论文笔记 1、 **研究背景与动机**2、方法概述3、RAG 模型架构3.1总体架构3.2 Generator(生成器)3.3 检索器(Retriever)3.4训练(Training)3.5**解码方法**(求近似 )3.6微调的参数 …

简易CPU设计入门:通用寄存器的读写

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后,我…

【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署

STM32-MBD(1)安装 Simulink STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署入门 STM32-MBD(3)Simulink 状态机模型的部署 【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型部署…

Linux运维相关基础知识(二)

系列文章目录 Linux常用命令 linux 账号管理与权限设定 Linux运维相关基础知识 文章目录 系列文章目录前言1. 自动任务执行at 与 atdcrontab 与 crond 2. SELinuxtty多任务管理与进程管理相关的命令/proc/* 文件的意义SELinux 3. 守护进程早期SystemV的init管理行为中daemon…

K8s集群平滑升级(Smooth Upgrade of K8S Cluster)

简介: Kubernetes ‌ (简称K8s)是一个开源的容器编排和管理平台,由Google开发并维护。它最初是为了解决谷歌内部大规模容器管理的问题而设计的,后来在2014年开源,成为云原生技术的核心组成部分。‌‌1 K8…

党员学习交流平台

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

uniapp--HBuilder开发

提示:本文为学习内容,若有错误,请联系作者,谦虚受教。 文章目录 前言一、下载HBuilder二、添加modbus相关库1.下载nodejs2.下载modbus库3.项目添加modbus库 三、HBuilder相关功能语句1.文件夹说明2.消息信息框3.开关按钮4.选中按钮…

GraphRAG实践:neo4j试用

文章目录 前言欢迎界面示例数据库使用大模型生成查询语句总结 前言 上回说道,我们使用docker部署了一个neo4j。 我们现在对它进行一些试用。 欢迎界面 在浏览器中输入http://localhost:7474/ 输入对应的东西,点击connect 现在咱的数据库里什么都没有…

两种分类代码:独热编码与标签编码

目录 一、说明 二、理解分类数据 2.1 分类数据的类型:名义数据与序数数据 2.2 为什么需要编码 三、什么是独热编码? 3.1 工作原理:独热编码背后的机制 3.2 应用:独热编码的优势 四、什么是标签编码? 4.1 工作原理&…