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

article/2025/10/12 7:18:44

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


http://chatgpt.dhexx.cn/article/1IW5dw8V.shtml

相关文章

Spring Authorization Server 0.2.3变化

目录 引言联邦认证示例public client默认设置Introspection端点自定义访问令牌类型⭐️令牌生成器优化⭐️拆分Client认证逻辑OAuth2ClientAuthenticationProvider⭐️授权端点逻辑⭐️关于0.3.0版本中JwtEncoder相关变化⭐️ 引言 Spring社区在2022-03-24 19:56发布了Spring …

spring authorization server 0.3.1 - 默认示例

spring authorization server 0.3.1 - 默认oidc 开始1、default-authorizationserver项目1.1、AuthorizationServerConfig.java1.2、DefaultSecurityConfig.java1.3、Jwks.java1.4、KeyGeneratorUtils.java1.5、DefaultAuthorizationServer.java1.6、application.yml 2、client…

Authorization Server 认证服务

Hi Auth HiAuth是一个开源的基于Oauth2协议的认证、授权系统,除了标准的Oauth2授权流程功能外,还提供了应用管理、用户管理、权限管理等相关功能。 在这个项目中你能够了解到如何基于spring-security-oauth2-authorization-server实现自己的Authorizat…

java authorization_OkHttp3 之 Authorization处理认证(四)

处理验证 这部分和HTTP AUTH有关. HTTP AUTH 使用HTTP AUTH需要在server端配置http auth信息, 其过程如下:客户端发送http请求 服务器发现配置了http auth, 于是检查request里面有没有”Authorization”的http header 如果有, 则判断Authorization里面的内容是否在用户列表里面…

shiro授权过程

一、授权的核心概念 授权,也就是权限认证或访问控制,即在应用中控制谁能访问哪些资源 授权中的核心要素: 1 用户,在shiro中代表访问系统的任何客户端,即subject 2 角色,是权限的集合,或字符串值…

安全-认证授权、数据脱敏

一、认证授权 JWT :JWT(JSON Web Token)是一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。 SSO(单点登录) :SSO(Single Sign On) 即单…

认证 (authentication) 和授权 (authorization) 的区别

以前一直傻傻分不清各种网际应用中 authentication 和 authorization, 其实很简单: 这两个术语通常在安全性方面相互结合使用,尤其是在获得对系统的访问权限时。两者都是非常重要的主题,通常与网络相关联,作为其服务基础架构的关键部分。然而…

Authorization—权限控制流程

本篇是对Shiro体系架构的介绍,本栏目大部分内容来自于Shiro官网。翻译过程中已经尽量保证用词的准确性和易懂性,如有不准确或者不确切的地方,请联系作者加以修改。本篇内容翻译自Authorization特征与Authorization官方指南。 Authorization&…

认证 (Authentication) 和授权 (Authorization)的区别是什么?

说简单点就是: 认证 (Authentication): 你是谁。 授权 (Authorization): 你有哪些权限 干什么事情。 稍微正式点(啰嗦点)的说法就是: Authentication(认证) 是验证您的身份的凭据&a…

变量定义与类型

命名 保留字与关键字 关键字是系统已经用的,保留字是系统自带的的保留 为以后使用做准备 查看关键字方法 import keyword #引入关键字模块 print (keyword.kwlist) #打印系统全部关键字 变量声明 三种格 #格式1 s1 "北京图灵学…

Java变量定义时候的注意事项

常量定义的基本注意事项 在JAVA语言中,主要利用final关键字,(在java类中灵活使用Static关键字)来定义常量。 当常量被设定后,一般情况下就不允许在进行修改,如可以利用以下形式来定义一个常量:final doubl…

变量的定义和使用

目录 一、变量的定义 二、变量的组成 1.标识 2.类型 3.值 三、变量的多次赋值 一、变量的定义 变量名(name) 赋值运算符() 值(小王) name 小王 二、变量的组成 1.标识 表示对象所存储的物理地址,使用内置函数 id(obj) 来获取。 print(id(name)) 运行…

C语言中变量声明和变量定义的区别

本文转载至CSDN博客JeanCheng 变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。变量声明:用于向程序表明变量的类型和名字。定义也是声明,extern声明不是定义…

C++ 中的变量定义

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。 变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; 在这里,type 必须是一个有效的 C 数据类型…

十:变量的定义和声明的区别?

1. 变量的声明: 声明是用来告诉编译器变量的名称和类型,而不分配内存。变量的声明有两重含义: 告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。 告诉编译…

C语言基础教程 之 如何定义变量!

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; 在这里,type 必须是一个有效的 C 数据类型&…

变量的定义

变量 变量用于存储编程所使用的数据和方法。 声明一般变量的关键字:var,let,const.其中let和const是es6的语法。 声明其他特殊变量的关键字:function,class,improt(先了解)等 声明变量 变量用于存储数据,因此可以把变量实际上就…

03-变量的定义

一、变量的定义 1.变量是什么? 一句话概括:变量是用来临时保存数据的,该数据是可以变化的数据。 2.什么时候需要定义变量? 如果某个内容需要多次使用,并且在代码中重复出现,那么可以用变量代表该内容。…