You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security OAuth2中如何在令牌请求体中发送自定义参数

解决方案:在OAuth2令牌请求体中添加token_content_type=jwt参数

要在Spring Security OAuth2客户端的令牌请求体中添加自定义参数,你需要定制令牌请求的参数转换器,并将其配置到令牌响应客户端中。以下是具体实现步骤:

1. 自定义授权码模式的请求参数转换器

创建一个继承自OAuth2AuthorizationCodeGrantRequestEntityConverter的类,重写getParameters方法来添加额外参数:

import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequestEntityConverter;
import org.springframework.util.MultiValueMap;

public class CustomAuthorizationCodeGrantRequestEntityConverter extends OAuth2AuthorizationCodeGrantRequestEntityConverter {

    @Override
    protected MultiValueMap<String, String> getParameters(OAuth2AuthorizationCodeGrantRequest authorizationCodeGrantRequest) {
        // 先获取默认的请求参数
        MultiValueMap<String, String> parameters = super.getParameters(authorizationCodeGrantRequest);
        // 仅针对指定provider添加自定义参数
        String registrationId = authorizationCodeGrantRequest.getClientRegistration().getRegistrationId();
        if ("provider-name".equals(registrationId)) {
            parameters.add("token_content_type", "jwt");
        }
        return parameters;
    }
}

2. 配置自定义的令牌响应客户端

创建配置类,定义OAuth2AuthorizationCodeTokenResponseClient的Bean,绑定自定义转换器:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient;
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeTokenResponseClient;

@Configuration
public class OAuth2ClientConfig {

    @Bean
    public OAuth2AuthorizationCodeTokenResponseClient authorizationCodeTokenResponseClient() {
        DefaultAuthorizationCodeTokenResponseClient tokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient();
        tokenResponseClient.setRequestEntityConverter(new CustomAuthorizationCodeGrantRequestEntityConverter());
        return tokenResponseClient;
    }
}

3. 更新SecurityFilterChain配置

在Security配置中注入自定义令牌响应客户端,并配置到oauth2Login的tokenEndpoint中:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeTokenResponseClient;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;

@EnableWebSecurity
public class SecurityConfig {

    private final ClientRegistrationRepository clientRegistrationRepository;
    private final OAuth2AuthorizationCodeTokenResponseClient tokenResponseClient;

    // 构造器注入依赖
    public SecurityConfig(ClientRegistrationRepository clientRegistrationRepository,
                          OAuth2AuthorizationCodeTokenResponseClient tokenResponseClient) {
        this.clientRegistrationRepository = clientRegistrationRepository;
        this.tokenResponseClient = tokenResponseClient;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
         return http
                .authorizeHttpRequests(auth -> {
                    auth.requestMatchers("/a/token").permitAll();
                    auth.anyRequest().authenticated(); // 根据业务需求调整认证规则
                })
                 .oauth2Login(oauth2 ->
                         oauth2.authorizationEndpoint(endpoint ->
                                 endpoint.authorizationRequestResolver(new CustomAuthorizationRequestResolver(clientRegistrationRepository)))
                         // 绑定自定义令牌响应客户端
                         .tokenEndpoint(endpoint ->
                                 endpoint.accessTokenResponseClient(tokenResponseClient)))
                 .formLogin(withDefaults())
                 .build();
    }
}

验证配置

开启DEBUG日志确认参数是否生效,在application.yaml中添加:

logging:
  level:
    org.springframework.security.oauth2.client.endpoint: DEBUG

启动应用后,查看日志中令牌请求的参数输出,确认token_content_type=jwt已包含在请求体中。

内容的提问来源于stack exchange,提问作者Marius Manastireanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:15:11