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参数的生成流程。
首先编写自定义转换器实现:
再将自定义转换器注册为Spring Bean,替换默认实现:public class PkceDisabledAuthCodeGrantRequestConverter extends OAuth2AuthorizationCodeGrantRequestEntityConverter { @Override public RequestEntity<MultiValueMap<String, String>> convert(OAuth2AuthorizationCodeGrantRequest grantRequest) { // 跳过父类内置的PKCE生成逻辑,直接使用通用授权请求转换能力 OAuth2AuthorizationRequestRequestEntityConverter commonConverter = new OAuth2AuthorizationRequestRequestEntityConverter(); return commonConverter.convert(grantRequest.getAuthorizationRequest()); } }
该方式逻辑纯粹,不会引入无业务意义的配置值,是适配不支持PKCE的身份服务器的常规方案。@Configuration public class CustomOAuth2ClientConfig { @Bean public OAuth2AuthorizationCodeGrantRequestEntityConverter authCodeGrantConverter() { return new PkceDisabledAuthCodeGrantRequestConverter(); } } - 手动构建授权客户端管理器,过滤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
相关产品推荐
相关产品推荐

