同一Keycloak realm下认证客户端无法访问同领域其他客户端应用
背景说明
我使用Keycloak作为身份提供方,相关应用配置如下:
- 已注册一个访问类型为confidential的
springboot-mvc-client客户端,配置了authorization_code授权类型。访问该应用时会自动跳转至Keycloak登录页,登录成功后可正常访问应用页面,流程运行正常。 - 另一个
springboot-rest-api应用作为资源服务器,初始application.properties配置为:
server.port=8182 spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8181/auth/realms/my-realm
- 从
springboot-mvc-client提取AccessToken作为Authorization请求头,通过RestTemplate调用springboot-rest-api接口的流程可正常运行。
问题描述
将springboot-rest-api在Keycloak中也注册为confidential访问类型的客户端后,从springboot-mvc-client发起API调用失败,返回的响应为Keycloak登录页的HTML内容。
我的初始理解是:两个客户端都注册在同一个Realm下,应该可以使用springboot-mvc-client认证后获取的令牌调用springboot-rest-api的接口,不确定该理解是否正确。
额外排查结果
- 将
springboot-rest-api的访问类型从confidential改为bearer-only后,调用恢复正常 - 通过
client_credentials授权模式获取springboot-rest-api自身的AccessToken,使用该令牌也可正常调用接口
咨询问题
即便处于同一Realm下,也无法使用一个confidential客户端的访问令牌访问另一个confidential客户端的资源吗?
更新1:问题解决
为springboot-rest-api添加OAuth安全配置后问题解决,可使用从springboot-mvc-client获取的同一个AccessToken调用接口,新增配置如下:
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity .authorizeRequests() .anyRequest().authenticated() .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .cors() .and() .csrf() .disable() .oauth2ResourceServer() .jwt(); } }
更新2:补充观察
当springboot-rest-api仅作为资源服务器配置,仅在application.properties中添加spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8181/auth/realms/my-realm配置时,不需要添加上述SecurityConfig配置;但如果需要springboot-rest-api同时作为OAuth Client和资源服务器运行,就需要添加上述SecurityConfig配置。
内容的提问来源于stack exchange,提问作者K. Siva Prasad Reddy

