Spring Authorization Server集成Keycloak作为OIDC身份提供商及登录跳转问题排查
以下是针对登录后无法重定向回Keycloak问题的具体修复步骤:
补充授权码授权类型
当前配置的RegisteredClient仅支持CLIENT_CREDENTIALS授权类型,但Keycloak作为OIDC客户端需要使用授权码流程(AUTHORIZATION_CODE),必须添加该类型。修改registeredClientRepository()方法:RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("client") .clientSecret("{noop}secret") .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) // 新增授权码类型 .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN) // 可选:添加刷新令牌支持 .redirectUri("http://KEYCLOAK_URL:8082/realms/你的Realm名称/broker/spring/endpoint") // 替换为Keycloak实际回调地址 .scope(OidcScopes.OPENID) .scope(OidcScopes.PROFILE) // 可选:添加用户信息范围 .build();替换通配符Redirect URI为精确地址
通配符*会导致Spring Authorization Server无法精准匹配回调地址,需使用Keycloak身份提供商配置页中给出的Redirect URI(格式通常为http://<Keycloak域名>:<端口>/realms/<Realm名>/broker/<提供商ID>/endpoint),将其填入redirectUri()方法中。调整SecurityFilterChain避免冲突
授权服务器的authServerSecurityFilterChain已配置formLogin,DefaultSecurityConfig中的重复配置可能引发冲突,建议简化或调整优先级:@EnableWebSecurity public class DefaultSecurityConfig { @Bean @Order(1) // 优先级低于授权服务器的HIGHEST_PRECEDENCE SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated(); // 若授权服务器已处理登录逻辑,可移除此处的formLogin配置 return http.build(); } }同时确保授权服务器的OIDC元数据端点
http://AUTH_SRVER_URL:9000/.well-known/openid-configuration可正常访问,这是Keycloak识别身份提供商的核心依据。验证Issuer地址有效性
确认ProviderSettings中的issuer地址http://AUTH_SRVER_URL:9000是Keycloak可访问的有效地址,启动Spring授权服务器后,访问该地址下的元数据端点需返回完整的OIDC配置信息。
内容的提问来源于stack exchange,提问作者Raouf Rhimi

