You need to enable JavaScript to run this app. Spring Security OAuth2 Client如何关闭默认PKCE适配不支持PKCE的身份服务器的方法
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security OAuth2 Client如何关闭默认PKCE适配不支持PKCE的身份服务器的方法

Spring Boot 2.3.4.RELEASE 禁用OAuth2授权码流程默认PKCE的实现方法

该版本的Spring Security OAuth2 Client 内置PKCE自动触发逻辑:当注册的OAuth2客户端被判定为公共客户端(即clientSecret为空或配置为{none}占位值)时,会自动生成并附加code_challenge、code_challenge_method参数到授权请求中,无原生配置开关可直接关闭。可通过以下三种可落地的方式实现完全禁用:

  • 为客户端配置占位非空的客户端密钥
    直接通过应用配置给对应客户端配置任意非空的client-secret值,即可让Spring判定该客户端为机密客户端,自动跳过PKCE生成分支。哪怕对接的身份服务器实际不会校验这个密钥值,该配置也能生效。
    配置示例:
    spring:
      security:
        oauth2:
          client:
            registration:
              your-idp-client:
                provider: your-idp
                client-id: your-registered-client-id-on-idp
                # 填写任意非空值即可,身份服务器无需识别该值
                client-secret: placeholder-unused-secret
                authorization-grant-type: authorization_code
                redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
    
    该方式改动量最小,不需要额外编写自定义配置类,适合快速适配场景。
  • 自定义授权请求转换器,移除PKCE生成逻辑
    如果不想配置无意义的占位密钥,可通过自定义组件覆盖默认的授权请求转换逻辑,从根源上移除PKCE参数的生成流程。
    首先编写自定义转换器实现:
    public class PkceDisabledAuthCodeGrantRequestConverter extends OAuth2AuthorizationCodeGrantRequestEntityConverter {
      @Override
      public RequestEntity<MultiValueMap<String, String>> convert(OAuth2AuthorizationCodeGrantRequest grantRequest) {
        // 跳过父类内置的PKCE生成逻辑,直接使用通用授权请求转换能力
        OAuth2AuthorizationRequestRequestEntityConverter commonConverter = new OAuth2AuthorizationRequestRequestEntityConverter();
        return commonConverter.convert(grantRequest.getAuthorizationRequest());
      }
    }
    
    再将自定义转换器注册为Spring Bean,替换默认实现:
    @Configuration
    public class CustomOAuth2ClientConfig {
      @Bean
      public OAuth2AuthorizationCodeGrantRequestEntityConverter authCodeGrantConverter() {
        return new PkceDisabledAuthCodeGrantRequestConverter();
      }
    }
    
    该方式逻辑纯粹,不会引入无业务意义的配置值,是适配不支持PKCE的身份服务器的常规方案。
  • 手动构建授权客户端管理器,过滤PKCE相关属性
    若项目中已经自定义了OAuth2AuthorizedClientManager,可在构建流程中增加属性过滤逻辑,直接从授权请求参数中移除PKCE相关内容。
    配置示例片段:
    @Bean
    public OAuth2AuthorizedClientManager authorizedClientManager(
        ClientRegistrationRepository clientRegistrationRepository,
        OAuth2AuthorizedClientRepository authorizedClientRepository) {
    
      DefaultOAuth2AuthorizedClientManager clientManager =
          new DefaultOAuth2AuthorizedClientManager(
              clientRegistrationRepository, authorizedClientRepository);
    
      // 自定义授权请求转换逻辑,移除内置生成的PKCE属性
      clientManager.setAuthorizationRequestConverter(originalRequest -> 
          OAuth2AuthorizationRequest.from(originalRequest)
              .attributes(attrs -> attrs.remove(CodeChallengeGenerator.class.getName()))
              .build()
      );
    
      return clientManager;
    }
    
    该方式对已有定制化客户端管理逻辑的项目侵入性更低,不需要额外新增独立的自定义转换器。

注意:Spring Boot 2.3.4.RELEASE 版本没有提供原生的code-challenge-enabled类配置开关,以上方案均基于该版本的内置代码逻辑实现适配,不需要升级框架版本即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 04:54:07