oauth2 授权码模式 流程说明和接口整理

news/发布时间2024/5/16 6:23:27

一、说明

oauth2 授权模式一共有四种,即隐式授权模式、授权码授权模式、密码授权模式和客户端授权模式。
这里仅对授权码授权模式所包含的流程和接口做说明和整理。
具体的概念和源码解读,资料有很多,可以自行去搜索学习。

二、流程说明

假设有这样一个场景:现有A系统和B系统,A系统想要使用B系统的账号来做三方登录,那么A系统就必须要获取B系统的授权,以便拿到B系统的用户信息。(可以参考微信账号的三方登录场景)
想要实现以上场景就可以使用oauth2的授权码模式,具体流程参考下图:

oauth2-授权码授权模式

其中clientId、clientSecret、redirectUri等信息涉及到的表是:oauth_client_details

三、所涉及到的接口以及代码整理

以下会对接口做简要说明,最重要的是整理涉及到的自定义配置
想要了解具体代码逻辑实现,可以重点看一下 AuthorizationEndpoint 这个类的源码

① /oauth/authorize 接口 GET请求

该接口对应上图的第一步,即传递参数,获取B系统的登录界面。

authorize-get
oauth2的登录界面很丑,很难满足实际使用场景,可以通过在认证服务器配置中使用自定义的登录页面替换。

@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().disable().requestMatchers().antMatchers("/login*","/oauth/authorize").and().authorizeRequests().anyRequest().permitAll().and().formLogin()//使用自定义的登录页面.loginPage("/login.html").loginProcessingUrl("/login");
}

注:如果同时存在认证服务器配置和资源服务牌配置的话,需要设置认证服务器配置的优先级高于资源服务器配置。

/*** 认证服务器配置*/
@Configuration
@Order(1) //设置该配置的优先级
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {......
}/*** 资源服务器配置*/
@Configuration
@EnableResourceServer
public class UnifiedResourceServerConfig extends ResourceServerConfigurerAdapter {......
}

② /oauth/confirm_access 接口

该接口会重定向到授权页面,同样,oauth2的授权界面很难满足实际使用场景,可以通过配置替换为自定义的授权页面。

//替换为自定义的授权页面
endpoints.pathMapping("/oauth/confirm_access", "/custom/confirm_access");
//自定义授权页面
@Controller
@SessionAttributes("authorizationRequest")
public class GrantController {@RequestMapping("/custom/confirm_access")public ModelAndView getAccessConfirmation(Map<String, Object> model, HttpServletRequest request) {AuthorizationRequest authorizationRequest = (AuthorizationRequest) model.get("authorizationRequest");ModelAndView view = new ModelAndView();view.setViewName("grant");view.addObject("clientId", authorizationRequest.getClientId());view.addObject("scopes",authorizationRequest.getScope());return view;}
}
<!-- 自定义授权页面 -->
<form method="post" action="/oauth/authorize"><input type="hidden" name="user_oauth_approval" value="true"><div th:each="item:${scopes}"><input type="radio" th:name="'scope.'+${item}" value="true" hidden="hidden" checked="checked"/></div><button class="btn" type="submit"> 同意/授权</button>
</form>

授权后的信息存放在 oauth_approvals 表中。
具体源码可以查看 JdbcApprovalStore 类,该类中的sql默认是使用 Mysql 语法,同样可以通过自定义替换成别的数据库语法。

③ /oauth/authorize 接口 POST请求

该接口会生成code码,最终会重定向到A系统的redirectUrl地址,并将生成的code码以参数的形式传递到A系统。

生成的code码保存在 oauth_code 表中。
具体源码可以查看 JdbcAuthorizationCodeServices 类。

可以在代码中自定义code码生成规则

public class UnifiedAuthorizationCodeServices extends JdbcAuthorizationCodeServices {public UnifiedAuthorizationCodeServices(DataSource dataSource) {super(dataSource);}private RandomValueStringGenerator generator = new RandomValueStringGenerator(13);@Overridepublic String createAuthorizationCode(OAuth2Authentication authentication) {String code = generator.generate();store(code, authentication);return code;}
}

配置代码

@Bean
public AuthorizationCodeServices authorizationCodeServices() {return new UnifiedAuthorizationCodeServices(dataSource);
}@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {// token 携带额外信息TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer()));endpoints.userDetailsService(userDetailsService).tokenStore(tokenStore()).tokenServices(defaultAuthorizationServerTokenServices()).authenticationManager(authenticationManager).accessTokenConverter(getAccessTokenConverter()).exceptionTranslator(oauth2ResponseExceptionTranslator)//自定义sql查询语句.approvalStore(jdbcApprovalStore())//自定义授权码生成规则.authorizationCodeServices(authorizationCodeServices());//替换为自定义的授权页面endpoints.pathMapping("/oauth/confirm_access", "/custom/confirm_access");
}

④ /oauth/token 接口 authorization_code模式

该接口对应图中,A系统访问B系统,传递clientId,clientSecret,code,redirectUri等参数换取B系统的accessToken和refreshToken。

使用code换取token
有了B系统token,就可以通过token调用B系统的接口获取B系统的用户信息了。

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

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

相关文章

开工大吉!龙年第一个赚钱机会,是AI知识付费?人工智能文生视频大模型Sora,颠覆性的革命?

2月16日&#xff0c;OpenAI推出AI大模型Sora。美国知名科技博主马克斯布朗利表示&#xff0c;相比一年前的AI视频工具&#xff0c;Sora有了长足的进步&#xff0c;或将拉响影视行业失业警报。 OpenAI推出AI大模型Sora Sora&#xff0c;OpenAI发布的人工智能文生视频大模型&…

企业计算机服务器中了mkp勒索病毒怎么办?Mkp勒索病毒解密处理

随着网络技术的不断发展&#xff0c;企业的生产运营也加大了步伐&#xff0c;网络为企业的生产运营提供了强有力保障&#xff0c;但网络是一把双刃剑&#xff0c;给企业带来便利的同时也为企业带来了严重的数据威胁。春节期间&#xff0c;云天数据恢复中心接到很多企业的值班人…

AlexNet的出现推动深度学习的巨大发展

尽管AlexNet&#xff08;2012&#xff09;的代码只比LeNet&#xff08;1998&#xff09;多出几行&#xff0c;但学术界花了很多年才接受深度学习这一概念&#xff0c;并应用其出色的实验结果。 AlexNet&#xff08;由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同设计…

【自然语言处理】seq2seq模型—机器翻译

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

DS:八大排序之归并排序、计数排序

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、归并排序 1.1 思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子…

并发编程-多线程并发特性

多线程并发的三个特性 原子性&#xff1a;即一个操作或多个操作&#xff0c;要么全部执行&#xff0c;要么就都不执。执行过程中&#xff0c;不能被打断有序性&#xff1a;程序代码按照先后顺序执行 为什么会出现无序问题呢&#xff1f;因为指令重排&#xff08;重排序是编译器…

openlayers地图点击标记点,弹出当前位置自定义弹窗(三)

1. 效果图 2. 代码 <template><div class"container"><div id"map" stylewidth: 100%; height: 100%;border: 5px solid #a4cdff;><div class"toolBox"><div class"messageBox" v-show"isShow&quo…

算法沉淀——BFS 解决最短路问题(leetcode真题剖析)

算法沉淀——BFS 解决最短路问题&#xff08;leetcode真题剖析&#xff09; 01.迷宫中离入口最近的出口02.最小基因变化03.单词接龙04.为高尔夫比赛砍树 BFS&#xff08;广度优先搜索&#xff09;是解决最短路径问题的一种常见算法。在这种情况下&#xff0c;我们通常使用BFS来…

【漏洞复现-通达OA】通达OA report_bi存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力,包括流程审批、行政办公、日常事务、数据统计…

MySQL篇之SQL优化

一、表的设计优化 表的设计优化&#xff08;参考阿里开发手册《嵩山版》&#xff09;&#xff1a; 1. 比如设置合适的数值&#xff08;tinyint int bigint&#xff09;&#xff0c;要根据实际情况选择。 2. 比如设置合适的字符串类型&#xff08;char和varchar&#xff09…

MSS与cwnd的关系,rwnd又是什么?

cwnd初始状态是多少&#xff1f; 拥塞窗口&#xff08;cwnd&#xff09;的初始状态通常设为1&#xff08;MSS)&#xff0c;即cwnd1。 在TCP连接建立初期&#xff0c;为了谨慎地探测网络容量&#xff0c;拥塞窗口&#xff08;cwnd&#xff09;会被设置为一个较小的值&#xff…

详解tomcat中的jmx监控

目录 1.概述 2.如何开启tomcat的JMX 3.tomcat如何实现JMX的源码分析 1.概述 本文是博主JAVA监控技术系列文章的第二篇&#xff0c;前面一篇文章中我们介绍了JAVA监控技术的基石——jmx&#xff1a; 【JMX】JAVA监控的基石-CSDN博客 本文我们将从使用和源码实现两个方面聊…

【c++】list详细讲解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉list库 > 毒鸡汤&#xff1a;你的脸上云淡…

【java苍穹外卖项目实战三】nginx反向代理和负载均衡

文章目录 1、nginx反向代理2、nginx 反向代理的好处3、nginx 反向代理的配置方式5、nginx 负载均衡的配置方式6、nginx 负载均衡策略 我们思考一个问题&#xff1a; 前端发送的请求&#xff0c;是如何请求到后端服务的&#xff1f; 前端请求地址&#xff1a;http://localhost/…

快速搭建PyTorch环境:Miniconda一步到位

快速搭建PyTorch环境&#xff1a;Miniconda一步到位 &#x1f335;文章目录&#x1f335; &#x1f333;一、为何选择Miniconda搭建PyTorch环境&#xff1f;&#x1f333;&#x1f333;二、Miniconda安装指南&#xff1a;轻松上手&#x1f333;&#x1f333;三、PyTorch与Minic…

MySQL篇----第十四篇

系列文章目录 文章目录 系列文章目录前言一、MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?二、锁的优化策略三、索引的底层实现原理和优化四、什么情况下设置了索引但无法使用前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…

c++用户管理信息(单链表管理)

c用户管理信息---单链表管理 类示意图select类示意图cFile类示意图ListStu类示意图ClassStu示意图 项目源代码selectselect.hselect.cpp cFilecFile.hcFile.cpp ListStuListStu.hListStu.cpp ClassStuClassStu.hClassStu.cpp main 源码 类示意图 select类示意图 cFile类示意图…

ChatGPT的大致原理

国外有个博主写了一篇博文&#xff0c;名字叫TChatGPT: Explained to KidsQ」&#xff0c; 直译过来就是&#xff0c;给小孩子解释什么是ChatGPT。 因为现实是很多的小孩子已经可以用父母的手机版ChatGPT玩了 &#xff0c;ChatGPT几乎可以算得上无所不知&#xff0c;起码给小孩…

嵌入式I2C 信号线为何加上拉电阻(图文并茂)

IIC 是一个两线串行通信总线&#xff0c;包含一个 SCL 信号和 SDA 信号&#xff0c;SCL 是时钟信号&#xff0c;从主设备发出&#xff0c;SDA 是数据信号&#xff0c;是一个双向的&#xff0c;设备发送数据和接收数据都是通过 SDA 信号。 在设计 IIC 信号电路的时候我们会在 SC…

[ai笔记10] 关于sora火爆的反思

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第10篇分享&#xff01; 最近sora还持续在技术圈、博客、抖音发酵&#xff0c;许多人都在纷纷发表对它的看法&#xff0c;这是一个既让人惊喜也感到焦虑的事件。openai从2023年开始&#xff0c;每隔几个…
推荐文章