Spring Authorization Server 系列(二)获取授权码

news2024/11/24 9:11:18

Spring Authorization Server 系列(二)获取授权码

    • 概述
    • 获取授权码
      • 获取授权码的url
      • 逻辑解析
        • 匹配url
        • 参数解析
      • 三级目录

概述

Spring Authorization Server 是基于 OAuth2.1 和 OIDC 1.0 的。
只有 授权码,刷新token,客户端模式。

获取授权码

用过Spring Security 的都知道,ta是基于一系列 Filter 实现其功能的,Spring Authorization Server 以及之前的 Spring Security OAuth解决方案也是如此。
通过查看API 知道,获取授权码的Filter为 OAuth2AuthorizationEndpointFilter
OAuth2的流程这里不赘述,下面开始解析 OAuth2AuthorizationEndpointFilter

获取授权码的url

查看源码,可以看到,这个filter默认匹配的url是 /oauth2/authorize
授权url

http://localhost:9000/oauth2/authorize?client_id=messaging-client&response_type=code&scope=openid+profile&state=xzy&redirect_uri=http://www.baidu.com

逻辑解析

匹配url

在这里插入图片描述
这是入口,如果当前请求匹配不上,则跳过此Filter
第一步 GET 请求 /oauth2/authorize,只要url和请求方式匹配即可

参数解析

一旦匹配上,接下来会进行参数解析;

  1. 解析get请求参数(包括首次的授权请求和登录成功后重定向第二次授权请求);这里可以发现一个点,用户认证的Filter在OAuth2的Filter之前,对于未认证的请求,OAuth2的Filter会将其重定向到登录页
    通过debug可以发现,解析GET请求参数的 converter为 OAuth2AuthorizationCodeRequestAuthenticationConverter

    • response_type
      在这里插入图片描述
      必须,且只能有一个
    • client_id
      在这里插入图片描述
      必须,且只能有一个
    • 当前认证上下文,如果已经认证,则取出认证结果,否则设置为匿名认证
      在这里插入图片描述
    • redirect_uri在这里插入图片描述
      可选,最多一个
    • scope在这里插入图片描述
      可选,最多一个
      但这个参数,要注意,它和其他参数有点不一样,如果有值,还会进一步处理
      在这里插入图片描述
      这个参数会以空格为点,进行拆分,形成一个集合
      这里又牵出了一个基础知识,我们知道在url中的一些特殊符号是不能直接使用的;涉及到url编码的一些问题。
      对于scope的值,如果要传多个,可以使用 + 或者 空格(%20) 隔开。
    • state在这里插入图片描述
      state是一个可选,但是推荐使用的参数。主要用于客户端确保 OAuth2.x 中回调那一步时,是真正的授权服务器回调给自己。
      使用方式为:在开始请求授权时,客户端传给授权服务器的一个随机字符串,然后授权服务器回调时,会原封不动将这个参数传给客户端,此时,客户端可以比较这两个值是否一致,只有一致时,表示这个回调来自真实的授权服务器,这个授权码是可信的
    • code_challenge && code_challenge_method
      这俩是后面新加的参数,对于一般的OAuth2授权流程是不需要的。
      ta主要是针对公共客户端的授权,一般指前端应用,不方便存储密钥的客户端。

    目的:用于授权服务器确定,使用获取code和换取token的同一个客户端。
    使用方式
    1. 本地生成一个随机字符串 code_verifier,使用 code_challenge_method算法,得到 一个 **code_challenge **
    2. 请求授权码时,将这两个值,都传给授权服务器,授权服务器会保存两个值 code_challenge_method code_challenge
    3.

第二步,Spring Security 会重定向到登录页,登录成功后,会再次重定向到请求授权页,此时还是 GET 请求

三级目录

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

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

相关文章

Python GUI:真的只知道PyQt?

B站|公众号:啥都会一点的研究生 有时候我们有需求将程序制作成GUI(图形用户界面)格式,以方便用户通过图形图标与电子设备进行交互,而大多数像我一样的小白基本上只知道PyQt,往往制作出来的界面一眼就可辨别…

如何编写快速高效的SQL查询(一)——MySQL8.0优化器查询优化处理与样例

当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理的方式运行。 MySQL是如何执行一个查询的过程的?根据图8-1可…

SpringCloud高级篇 - 微服务保护

✨作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 学习课程视频 SpringCloud 高级篇 – 微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0…

Spring IOC体系结构设计原理详解

Spring是一个开源的JavaEE全栈框架,其中最为重要的核心模块是Spring IOC(Inversion of Control)容器。它负责对象的生命周期管理及依赖注入,为开发者提供了一种主动参与对象创建过程的方式。本文将从IOC容器的设计原理出发&#x…

新增ES6中的扩展

1. ES6中数组新增了哪些扩展? Rest 参数与 Spread 语法 在 JavaScript 中,很多内建函数都支持传入任意数量的参数。 例如: Math.max(arg1, arg2, ..., argN) —— 返回参数中的最大值。Object.assign(dest, src1, ..., srcN) —— 依次将属…

Java 修饰符关键字

💟这里是CS大白话专场,让枯燥的学习变得有趣! 💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话! 💟好记性不如烂键盘,自己总结不如收藏别人! static …

【图神经网络】手把手带你快速上手OpenHGNN

手把手带你快速上手OpenHGNN 1. 评估新的数据集1.1 如何构建一个新的数据集 2. 使用一个新的模型2.1 如何构建一个新模型 3. 应用到一个新场景3.1 如何构建一个新任务3.2 如何构建一个新的trainerflow 内容来源 1. 评估新的数据集 如果需要,可以指定自己的数据集。…

【ROS】服务通信、话题通信的应用

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 服务通信、话题通信的应用 0. 话题发布1.话题订阅2.服务调用3.话题通信与服务通信的比较 本章将来学习如何利用话题通信,服务…

【软件分析/静态分析】学习笔记02——中间表示Intermediate Representation

🔗 课程链接:李樾老师和谭天老师的:南京大学《软件分析》课程02(Intermediate Representation)_哔哩哔哩_bilibili 目录 第二章 Intermediate Representation 2.1 编译器与静态分析器的关系(Compilers & Static …

SpringCloudAlibaba(简介及核心组件使用)

微服务架构常见的问题 一旦采用微服务系统架构,就势必会遇到这样几个问题: 这么多小服务,如何管理他们?服务发现/服务注册---》注册中心 这么多小服务,他们之间如何通讯?Feign -> 基于 http 的微服务调…

使用【Python+Appium】实现自动化测试

一、环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows,官网地址 Redirecting 点击下载按钮会到GitHub的…

使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库

使用golang 基于 OpenAI Embedding qdrant 实现k8s本地知识库 文章博客地址:套路猿-使用golang 基于 OpenAI Embedding qdrant 实现k8s本地知识库 流程 将数据集 通过 openai embedding 得到向量组装payload,存入 qdrant用户进行问题搜索,通过 openai embedding 得到向量,从…

“Jmeter WebSocket协议压测”,助你轻松应对高并发场景!

目录 引言 背景说明 步骤1:安装插件JMeter WebSocket Samplers 步骤2:采集器使用 步骤3:脚本执行 结语 引言 在当今高并发的网络环境下,WebSocket协议已经成为了最受欢迎的实时通信技术之一。然而,对于开发人员来…

CorelDRAW2023序列号及下载安装条件

始于1989年并不断推陈出新,致力为设计工作者提供更高效的设计工具!CorelDRAW滋养并见证了一代设计师的成长!在最短的时间内交付作品,CorelDRAW的智能高效会让你一见钟情!CorelDRAW 全称“CorelDRAW Graphics Suite“,也…

Linux:命令tar、zip、unzip对文件或文件夹进行压缩与解压

Linux:命令tar、zip、unzip对文件或文件夹进行压缩与解压 .tar压缩操作: 创建要进行压缩的文件: 对文件进行压缩: 将三个文件压缩成text.tar文件,压缩到当前路径下(默认也是在当前路径) 对比体积: 发现&…

关于f-stack转发框架的几点分析思考

使用DPDK收包,想要用到TCP协议栈,可选的方案有linux原生的tun/tap口以及DPDK自带的KNI驱动,这两种都是通过将DPDK收到的报文注入到linux内核来使用TCP协议栈的功能,然后,用户态协议栈可以考虑开源的f-stack&#xff0c…

在页面使用富文本编译器

富文本编译器的选择 Editor.mdTinyMCESimpleMDECKEditor 还有一些,这里讲的是我用的TinyMCE 1、下载 下载地址:下载tiny | TinyMCE中文文档中文手册 下载开发版本,我下载的最新版 tinymce_6.4.2_dev.zip 将压缩包解压后可以看到下面目录&…

(哈希表 ) 202. 快乐数——【Leetcode每日一题】

❓202. 快乐数 难度:简单 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到…

Groovy系列一 Groovy基础语法

目录 为什么要学习Groovy Groovy 介绍 Groovy 特点 Groovy 实战 动态类型 简单明了的list,map类型 在groovy世界任何东西都是对象 属性操作变得更容易 GString 闭包 委派:delegate Switch变得更简洁 元编程 强制类型检查 Elvis Operator 安全访问 为…

【五】设计模式~~~创建型模式~~~单例模式(Java)

【学习难度:★☆☆☆☆,使用频率:★★★★☆】 5.1. 模式动机 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一…