Spring Boot 3 OAuth2Client启动报错:无合适HttpMessageConverter求解
解决方法
1. 修正客户端Scope拼写错误
客户端配置中api-client-oidc的scope字段拼写错误,将opened改为OIDC标准的openid:
api-client-oidc: # ...其他配置 scope: openid
2. 允许授权服务OIDC端点匿名访问
当前授权服务的Security配置要求所有请求必须认证,导致客户端请求OIDC元数据端点时被重定向到登录页面(返回HTML)。修改授权服务的DefaultSecurityConfig,开放OIDC相关端点:
@Bean SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorizeRequests -> authorizeRequests .requestMatchers("/.well-known/openid-configuration", "/oauth2/jwks").permitAll() .anyRequest().authenticated()) .formLogin(Customizer.withDefaults()); return http.build(); }
3. 配置授权服务为OIDC兼容服务器
如果授权服务尚未配置为Spring Authorization Server,需完成以下步骤:
- 添加Spring Authorization Server依赖(Maven):
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-authorization-server</artifactId> <version>1.2.1</version> </dependency>
- 配置注册客户端和授权服务器设置:
@Configuration public class AuthorizationServerConfig { @Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient apiClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("api-client") .clientSecret("{noop}secret") // 生产环境需使用加密密码 .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("http://127.0.0.1:8080/login/oauth2/code/api-client-oidc") .redirectUri("http://127.0.0.1:8080/authorized") .scope("openid") .scope("api.read") .build(); return new InMemoryRegisteredClientRepository(apiClient); } @Bean public AuthorizationServerSettings authorizationServerSettings() { return AuthorizationServerSettings.builder().build(); } }
4. 验证OIDC元数据端点
启动授权服务后,直接访问http://auth-server:9000/.well-known/openid-configuration(本地测试替换auth-server为localhost),确认返回JSON格式的元数据,而非HTML页面。
5. 确保授权服务地址可解析
如果客户端无法解析auth-server主机名,修改客户端application.yml中的issuer-uri为可访问地址(如http://localhost:9000),或在客户端机器的hosts文件中添加auth-server到127.0.0.1的映射。
内容的提问来源于stack exchange,提问作者manjosh
相关产品推荐
相关产品推荐

