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

news2024/11/27 10:36:34

一、说明

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);

    @Override
    public 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.coloradmin.cn/o/1456488.html

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

相关文章

计算机网络知识-笔记

计算机网络知识总结 目录 应用层 HTTP 协议 概况HTTP 请求报文HTTP 响应报文首部行HTTP/1.1 协议缺点 HTTP/2 协议 二进制协议多路复用数据流头信息压缩服务器推送HTTP/2 协议缺点HTTP/3 协议 HTTPS 协议 HTTP 存在的问题HTTPS 简介TLS 握手过程实现原理 DNS 协议 概况域名的…

VsCode左边目录,父级目录悬浮粘滞在上方

解决方法&#xff1a; 文件 → 首选项 → 设置&#xff1a;

selenium googledriver 更多的参数配置

座右铭&#xff1a;怎么简单怎么来&#xff0c;以实现功能为主。 欢迎大家关注公众号与我交流 收集的一些selenium chrome配置信息&#xff1a;一些Chrome的地址栏命令&#xff08;这些命令会不停的变动&#xff0c;所有不一定都是好用的&#xff09;在Chrome的浏览器地址栏中输…

Java的跨平台特性

Java语言特别流行的其中一个原因就是其具有良好的跨平台性&#xff0c;Java的跨平台性表现在通过 Java 语言编写的应用程序在不同的系统平台上都能够正常运行。其原理是&#xff1a;只要在需要运行 java 应用程序的操作系统上&#xff0c;先安装一个 Java 虚拟机(JVM Java Virt…

java以及android类加载机制

类加载机制 一、Java类加载机制 java中&#xff0c;每一个类或者接口&#xff0c;在编译后&#xff0c;都会生成一个.class文件。 类加载机制指的是将这些.class文件中的二进制数据读入到内存中并对数据进行校验&#xff0c;解析和初始化。最终&#xff0c;每一个类都会在方…

浅谈TCP协议的可靠含义和三次握手

TCP协议全称传输控制协议&#xff08;Transmission Cotrol Protocol&#xff09; 1、TCP协议运行在哪一层 TCP运行在运输层。 2、TCP协议的可靠是什么意思 步入主题&#xff0c;很多同学的回答是TCP三次握手确保了可靠连接&#xff0c;这样说非常不严谨&#…

openai公司的sora目前仅限于内部人士使用,并未开启对外接口

openai公司的sora目前仅限于内部人士使用,并未开启对外接口&#xff01;既然大家都了解到了sora具备相当强大的视频创作能力&#xff0c;肯定都想尝试一下了。但是&#xff0c;经过笔者的申请发现&#xff0c;目前openai官方并未对外开放sora的调用接口。如下图所示&#xff1a…

梵宁教育陪你击退“假期综合征”

转眼间龙年春节小长假已然结束&#xff0c;学生党寒假余额也严重不足&#xff0c;光是想到复工、复学&#xff0c;是不是已经感到心情沉重、疲惫、乏力、头晕&#xff0c;好像身体被掏空&#xff1f;根据小编的经验&#xff0c;你可能中招了假期综合征。快来测测你有以下情况吗…

Eclipse - Formatter

Eclipse - Formatter References Window -> Preferences -> C/C -> Code Style -> Formatter BSD/Allman [built-in] or K& R [built-in] References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

工作中的得力助手

在这个快节奏的工作环境中&#xff0c;提高工作效率已经成为了每个人的当务之急。而工作实用软件无疑是成就这一目标的得力助手。在这海量软件中&#xff0c;我将为您推荐五款我个人认为最值得一试的软件&#xff0c;它们将为您提供全方位的工作支持&#xff0c;助您事半功倍。…

iPhone 16 组件泄露 揭示了新的相机设计

iPhone 16 的发布似乎已经等了很长一段时间&#xff0c;但下一个苹果旗舰系列可能会在短短 7 个月内与我们见面——而新的组件泄漏让我们对可能即将到来的重新设计有了一些了解。后置摄像头模块。 爆料者 Majin Bu&#xff08;来自 MacRumors&#xff09;获得的示意图显示&…

【Linux】进程的初步认识(二)

进程的初步认识 前言查看进程通过系统调用创建进程关于创建进程的几点补充 前言 之前的一篇文章(文章链接)已经初步对于进程有了一个认识&#xff0c;这篇文章主要是介绍如何去查看进程的相关信息以及创建一个进程的相关知识 查看进程 查看进程的信息可以在/proc系统文件夹中查…

【开源】SpringBoot框架开发服装店库存管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

借助Aspose.BarCode条码控件,C# 中的文本转 QR 码生成器

二维码用于在较小的空间内存储大量数据。它们易于使用&#xff0c;可以通过智能手机或其他设备扫描来打开网站、观看视频或访问其他编码信息。在这篇博文中&#xff0c;我们将学习如何使用 C# 以编程方式生成基于文本的 QR 码。我们将提供分步指南和代码片段&#xff0c;帮助您…

文件且目录损坏无法读取怎么办?

文件及目录损坏无法读取是计算机使用过程中的常见故障&#xff0c;这可能是由于多种原因导致的&#xff0c;例如硬件故障、文件系统错误、病毒感染或不当操作等。本文将对这一问题进行深入分析&#xff0c;探讨其根本原因&#xff0c;并提供相应的解决方法&#xff0c;包括数据…

行业扩展 | 什么是设备管理系统?你了解多少……

▲ 设备管理是以工厂设备为管理对象,应用科学的理论、方法,通过一系列的技术,经济,组织等措施对各种生产设备和工具的有效管理和维护,以确保生产线的正常运行和提高生产效率的现代化管理。 设备管理组织架构 在企业生产运营中,设备管理工作效率的高低往往取决于其管理架构的好…

堆详解以及简单的堆排序(源代码)

一、什么是堆&#xff1f; 堆是将数组看作一颗完全二叉树 大堆&#xff1a;任意一个父亲大于等于孩子 小堆&#xff1a;任意一个父亲小于等于孩子 有序数组一定是堆 但是堆不一定有序 注意&#xff1a;此“堆”是一个数据结构&#xff0c;用来表示完全二叉树 还有另外一个“…

渗透某巨型企业某个系统的奇葩姿势

本文由掌控安全学院 - urfyyyy 投稿 前言 这个月都在做一个巨型合作企业的渗透测试&#xff0c;这个系统本无方式getshell&#xff0c;得亏我心够细&#xff0c;想的多&#xff0c;姿势够骚。 文中重码&#xff0c;且漏洞已修复。 过程 找到getshell点 目标系统功能很少&…

Python实现时间序列分析霍尔特季节性平滑模型(Holt算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 霍尔特季节性平滑模型是指数平滑技术的一种扩展形式&#xff0c;由E. S. Holt和P. R. Winters分别独立…

nginx-在应用程序中发现不必要的Http响应头

描述:一般是在返回的响应表头中出现了Server键值对 解决方案: 通过headers-more-nginx-module模块将Server去除 https://github.com/openresty/headers-more-nginx-module ./configure --add-module/usr/local/headers-more-nginx-modulemakemake install 编译完成后&#…