首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring OAuth2.0:如何将自定义查询参数添加到授权代码(/oauth/authorize)响应中?

在Spring OAuth2.0中,可以通过自定义实现OAuth2RequestFactory接口来将自定义查询参数添加到授权代码响应中。下面是一个实现的示例:

  1. 创建一个自定义的OAuth2RequestFactory实现类,例如CustomOAuth2RequestFactory
代码语言:txt
复制
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.OAuth2Request;
import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.DefaultUserAuthenticationConverter;
import org.springframework.security.oauth2.provider.token.TokenEnhancer;
import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory;

import java.security.KeyPair;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class CustomOAuth2RequestFactory extends DefaultOAuth2RequestFactory {

    public CustomOAuth2RequestFactory(ClientDetailsService clientDetailsService) {
        super(clientDetailsService);
    }

    @Override
    public OAuth2Request createOAuth2Request(ClientDetails client, TokenRequest tokenRequest) {
        OAuth2Request oAuth2Request = super.createOAuth2Request(client, tokenRequest);

        // 添加自定义查询参数到授权代码响应中
        Map<String, String> customParameters = new HashMap<>();
        customParameters.put("customParam", "customValue");
        oAuth2Request.setExtensions(customParameters);

        return oAuth2Request;
    }
}
  1. 在配置类中使用自定义的OAuth2RequestFactory
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.approval.ApprovalStore;
import org.springframework.security.oauth2.provider.approval.ApprovalStoreUserApprovalHandler;
import org.springframework.security.oauth2.provider.approval.JdbcApprovalStore;
import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

import javax.sql.DataSource;
import java.security.KeyPair;
import java.util.Arrays;

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private DataSource dataSource;

    @Autowired
    private ClientDetailsService clientDetailsService;

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        KeyPair keyPair = new KeyStoreKeyFactory(
                new ClassPathResource("keystore.jks"), "password".toCharArray())
                .getKeyPair("alias");
        converter.setKeyPair(keyPair);
        return converter;
    }

    @Bean
    public ApprovalStore approvalStore() {
        return new JdbcApprovalStore(dataSource);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
        enhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter()));

        endpoints
                .tokenStore(tokenStore())
                .tokenEnhancer(enhancerChain)
                .approvalStore(approvalStore())
                .userApprovalHandler(userApprovalHandler())
                .authenticationManager(authenticationManager);
    }

    @Bean
    public TokenEnhancer tokenEnhancer() {
        return new CustomTokenEnhancer();
    }

    @Bean
    public ApprovalStoreUserApprovalHandler userApprovalHandler() {
        ApprovalStoreUserApprovalHandler approvalHandler = new ApprovalStoreUserApprovalHandler();
        approvalHandler.setApprovalStore(approvalStore());
        approvalHandler.setRequestFactory(new CustomOAuth2RequestFactory(clientDetailsService));
        approvalHandler.setClientDetailsService(clientDetailsService);
        approvalHandler.setUseApprovalStore(true);
        return approvalHandler;
    }
}

在上述示例中,CustomOAuth2RequestFactory类继承了DefaultOAuth2RequestFactory,并重写了createOAuth2Request方法,在该方法中添加了自定义的查询参数到授权代码响应中。

需要注意的是,示例中使用了JWT令牌存储方式,你可以根据实际需求选择其他的令牌存储方式。

这样,当进行授权代码流程时,自定义的查询参数将会包含在授权代码响应中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Security实战干货:集成微信公众号OAuth2.0授权

OAuth2.0客户端集成 ❝基于 Spring Security 5.x 微信网页授权的文档在网页授权,这里不再赘述。我们只聊聊如何结合Spring Security的事。...微信网页授权流程 接着按照微信提供的流程来结合Spring Security。 获取授权码code 微信网页授权使用的是OAuth2.0授权码模式。我们先来看如何获取授权码。...机制这里不讲了,在我个人博客felord.cnSpring Security 实战干货:客户端OAuth2授权请求的入口一文中有详细阐述。...自定义URL 因为Spring Security会根据模板链接去组装一个链接而不是我们填参数就行了,所以需要我们对构建URL的处理器进行自定义。 /** * 兼容微信的oauth2 端点....首先增加Content-Type为text-plain的适配;其次因为Spring Security接收token返回的对象要求必须显式声明tokenType,而微信返回的响应没有,我们一律指定为OAuth2AccessToken.TokenType.BEARER

1.5K30

可能是第二好的 Spring OAuth 2.0 文章,艿艿端午在家写了 3 天~

于是乎,艿艿准备再来分享一波 Spring Security OAuth 框架,看看在 Spring Security 如何实现 OAuth2.0 实现授权的功能。...可能有胖友对 OAuth2.0 不是很了解,所以我们先来简单介绍下它。可能胖友看 OAuth2.0 的概念会有点懵逼,不要担心,后续看完艿艿提供的示例代码,会突然清晰的哈。...OAuth2.0 是用于授权的行业标准协议。OAuth2.0 为简化客户端开发提供了特定的授权流,包括 Web 应用、桌面应用、移动端应用等。...1.2 OAuth2.0 角色解释 在 OAuth2.0 ,有如下角色: ① Authorization Server:认证服务器,用于认证用户。如果客户端认证通过,则发放访问资源服务器的令牌。...刷新令牌 “示例代码对应仓库: 授权服务器:lab-68-demo03-authorization-server-with-client-credentials 在 OAuth2.0 ,一共有两类令牌

2K30

整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)

之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一、oauth的角色.../oauth/authorize:验证 /oauth/token:获取token /oauth/confirm_access:用户授权 /oauth/error:认证失败 /oauth/check_token...的pathMapping()方法,有两个参数,第一个是默认的URL路径,第二个是自定义的路径 (2)WebSecurityConfigurer的实例,可以配置哪些路径不需要保护,哪些需要保护。...自定义UI: (1)有时候,我们可能需要自定义的登录页面和认证页面。登陆页面的话,只需要创建一个login为前缀名的网页即可,在代码里,设置为允许访问,这样,系统会自动执行你的登陆页。...以上是我从网上找到的一篇写的不错的博客,希望可以帮助大家快速了解OAuth2.0,下一篇文章我们正式介绍OAuth2.0在当前框架的使用。

1.8K60

一张图搞定OAuth2.0

目录 1、引言 2、OAuth2.0是什么 3、OAuth2.0怎么写 1、引言 本篇文章是介绍OAuth2.0最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们...,只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式。...OAuth2.0是什么——上帝视角   简单来说,上述例子的豆瓣就是客户端,QQ就是认证服务器,OAuth2.0就是客户端和认证服务器之间由于相互不信任而产生的一个授权协议。...就这这张图,来说一下上述例子的三个步骤在图中的表现。所用到的请求路径名称都是虚构的,所附带的请求参数忽略了一些非重点的。 如想了解每次的请求和响应的标准齐全的参数,还是去读那篇阮一峰的文章。...到此OAuth2.0授权结束。 ? 3、OAuth2.0怎么写 了解了上述过程后,代码自然就不难写了,起码框架是可以写出来的。

85431

【OIDC】基本概念

OAuth2.0 定义了【授权】框架;OpenID 为其扩展了【认证】的标准。OAuth2.0 帮用户获得接口的调用权限;OpenID 为用户提供身份标识。...OpenID 和 OAuth2.0 有着相同的流程。注意:不是 OAuth2.0 无法完成认证,而是 OAuth2.0 本身的认证过程缺乏统一的标准。二、流程描述OAuth2.0 如何完成授权?...资源服务器 提供链接,请 资源拥有者 去 授权服务器 完成认证;https://授权中心.com/oauth/authorize?...隐式授权(repsonse_type=token):1. 应用系统 请 资源所有者 访问 授权服务器 的链接;https://授权中心.com/oauth/authorize?...授权服务器 认证用户,返回 Access Token;https://应用系统.com/callback#token=ACCESS_TOKEN注意,此时的 Token 存放在锚点中,而非查询参数里,这样可以在

1.5K00

SpringBoot学习笔记(十五:OAuth2 )

由于OAuth1.0复杂的签名逻辑以及单一的授权流程存在较大缺陷,随后标准工作组又推出了 OAuth2.0草案,并在2012年10月正式发布其标准(编号RFC 6749)。...OAuth2.0放弃了OAuth1.0让开发者感到痛苦的数字签名和加密方案,使用已经得到验证并广泛使用的HTTPS技术作为安全保障手 段。...OAuth2.0OAuth1.0互不兼容,由于OAuth1.0已经基本退出历史舞台,所以下面提到的OAuth都是指OAuth2.0。...code=AUTHORIZATION_CODE 上面 URL ,code参数就是授权码。 ? 第三步,A 网站拿到授权码以后,就可以在后端,向 B 网站请求令牌。...,在Spring Security配置的权限控制将不会在进行OAuth2相关权限控制的校验时生效。

81520

Spring Security 6.x 一文快速搞懂配置原理

,特别是新手,在看过官方文档配置示例代码(如下所示)之后,在没有足够背景知识的情况下,都会对这个http.build()方法感到莫名的困惑,想要定制开发也不知从何下手,本文主要对整个Spring Security...OAuth2AuthorizationRequestRedirectFilter 用于接入OAuth2.0认证协议登录逻辑,例如Github登录 19 oidcLogout OidcBackChannelLogoutFilter...用于实现OAuth2.0客户端逻辑,例如授权码模式等 21 oauth2ResourceServer BearerTokenAuthenticationFilter 用于实现OAuth2.0服务端逻辑...参数的配置方法。...方法,而在configurer方法,创建出各种功能的Filter实例,并添加到List列表 最后通过performBuild方法,将List进行排序,并创建出DefaultSecurityFilterChian

28500

Spring Security OAuth2.0实现

Spring Security OAuth2.0即利用Spring Security框架对OAuth2标准的一种实现。...答案是否定的,服务提供商会给准入的接入方一个身份,用于接入时的凭据: client_id:客户端标识 client_secret:客户端秘钥 因此,准确来说,授权服务器对两种OAuth2.0的两个角色进行认证授权...OAuth2.0的服务提供方涵盖两个服务,即授权服务(Authorization Server,也叫认证服务)和资源服务(Resource Server),你可以选择把它们在同一个应用程序实现,也可以选择建立使用同一个授权服务的多个资源服务...以上的参数都将以 “/“ 字符为开始的字符串,框架的默认URL链接如下列表,可以作为这个 pathMapping() 方法的第一个参数: /oauth/authorize授权端点。...使用令牌请求资源: 令牌申请成功后,还可以使用/uaa/oauth/check_token校验令牌的有效性,并查询令牌的内容: 数据库动态配置 目前为止客户端信息和授权码仍然存储在内存,生产环境通常会存储在数据库

2.6K30

没错,用三方 Github 做授权登录就是这么简单!(OAuth2.0实战)

上一篇《OAuth2.0 的四种授权方式》文末说过,后续要来一波OAuth2.0实战,耽误了几天今儿终于补上了。...在这里插入图片描述 而GitHub授权登录正好用到了OAuth2.0最复杂的授权码模式,正好拿我这个案例给大家分享一下OAuth2.0授权过程,我把项目已经部署到云服务,文末有预览地址,小伙伴们可以体验一下...一、授权流程 在具体做GitHub授权登录之前,咱们再简单回顾一下OAuth2.0授权码模式的授权流程,如果 fire 网站允许 用GitHub 账号登录,流程大致如下图。 ?...https://github.com/login/oauth/authorize?...,OAuth2.0授权码模式还是比较简单的,搞懂了一个GitHub的登录,像微信、围脖其他三方登录也就都会了,完全是大同小异的东西,感兴趣的同学可以试一试。

1.4K20

Spring Security OAuth2 优雅的集成短信验证码登录以及第三方

前言 基于SpringCloud做微服务架构分布式系统时,OAuth2.0作为认证的业内标准,Spring Security OAuth2也提供了全套的解决方案来支持在Spring Cloud/Spring...Boot环境下使用OAuth2.0,提供了开箱即用的组件。...但是在开发过程我们会发现由于Spring Security OAuth2的组件特别全面,这样就导致了扩展很不方便或者说是不太容易直指定扩展的方案,例如: 图片验证码登录 短信验证码登录 微信小程序登录...有以下要求: 不侵入Spring Security OAuth2的原有代码 对于不同的登录方式不扩展新的端点,使用/oauth/token可以适配所有的登录方式 可以对所有登录方式进行兼容,抽象一套模型只要简单的开发就可以集成登录...阅读本篇文章您需要了解OAuth2.0认证体系、SpringBoot、SpringSecurity以及Spring Cloud等相关知识 思路 我们来看下Spring Security OAuth2的认证流程

4.3K30

Spring Security OAuth 2开发者指南译

它有两个参数: 端点的默认(框架实现)URL路径 需要的自定义路径(以“/”开头) 由框架提供的URL路径/oauth/authorize授权端点)/oauth/token(令牌端点)/oauth/confirm_access...自定义UI 大多数授权服务器端点主要由机器使用,但是有一些资源需要一个UI,而这些资源是GET /oauth/confirm_access和HTML响应/oauth/error。...自定义错误处理 授权服务器的错误处理使用标准Spring MVC功能,即@ExceptionHandler端点本身的方法。...在授权HttpMesssageConverters端点的情况下,在令牌端点和OAuth错误视图(/oauth/error)的情况下,异常呈现(可以添加到MVC配置)。...Facebook令牌响应在令牌的到期时间(它们使用expires而不是expires_in)也包含不符合规定的JSON条目,因此,如果要在应用程序中使用到期时间,则必须使用自定义手动解码OAuth2SerializationService

2.1K10

没错,用三方 Github 做授权登录就是这么简单!(OAuth2.0实战)

上一篇《OAuth2.0 的四种授权方式》文末说过,后续要来一波OAuth2.0实战,耽误了几天今儿终于补上了。...[在这里插入图片描述] 而GitHub授权登录正好用到了OAuth2.0最复杂的授权码模式,正好拿我这个案例给大家分享一下OAuth2.0授权过程,后续项目功能会持续更新。...一、授权流程 在具体做GitHub授权登录之前,咱们再简单回顾一下OAuth2.0授权码模式的授权流程,如果 fire 网站允许 用GitHub 账号登录,流程大致如下图。...https://github.com/login/oauth/authorize?...,OAuth2.0授权码模式还是比较简单的,搞懂了一个GitHub的登录,像微信、围脖其他三方登录也就都会了,完全是大同小异的东西,感兴趣的同学可以试一试。

1K00

Oauth2.0实现单点登录的原理流程,这次总该懂了!

OAuth2.0 进阶 3 基于 SpringBoot 实现认证/授权 3.1 授权服务器(Authorization Server) 3.2 客户端(Client, 业务网站) 3.3 用户权限控制...本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构的应用。...项目地址:https://github.com/YunaiV/ruoyi-vue-pro 2 OAuth2 认证授权的原理流程 2.1 生活实例【★★重点★★】 为了直观的理解 OAuth2.0 原理流程...A的查询权限,就开具“允许张三查询档案局A”的授权信(授权码 / code),张三带上授权信被重定向至“档案局”的“用户登录处”; (7)张三到了“档案局”的“用户登录处”,该处私下拿出档案局A的标识(...:8110/oauth/token security.oauth2.client.user-authorization-uri=http://localhost:8110/oauth/authorize

1.5K30

一口气说出 OAuth2.0 的四种授权方式

下面我们会分析每种授权方式的原理,在进入正题前,先了解 OAuth2.0 授权过程几个重要的参数: response_type:code 表示要求返回授权码,token 表示直接返回令牌 client_id...1、授权OAuth2.0四种授权授权码方式是最为复杂,但也是安全系数最高的,比较常用的一种方式。这种方式适用于兼具前后端的Web项目,因为有些项目只有后端或只有前端,并不适用授权码模式。...https://wx.com/oauth/authorize?...https://wx.com/oauth/authorize?...4、凭证式 凭证式和密码式很相似,主要适用于那些没有前端的命令行应用,可以用最简单的方式获取令牌,在请求响应的 JSON 结果返回 token。

1.3K20

几行代码搞定 Spring Cloud OAuth2 授权码模式3个页面定制

:妹子始终没搞懂OAuth2.0,今天整合Spring Cloud Security 一次说明白!...Spring Security 配置 只需要在Spring Security 的表单登录定义一下跳转的接口即可,代码如下: 代码解释如下: loginProcessingUrl:这个是定义的form...这个自定义就相对麻烦了,需要对Spring Security 底层原理有一定的了解 1. 定制页面 陈某随便找了一个页面oauth-grant.html,代码如下: 2....的配置修改一下配置,代码如下: 按照上述3个步骤即可轻松的实现授权页面自定义,效果如下: 授权码模式的异常页面重定制 这个异常页面什么意思呢?...授权码的请求url如下: http://localhost:9001/blog-auth-server/oauth/authorize?

42020
领券