【发布时间】:2021-12-02 13:53:41
【问题描述】:
我使用 Keycloak 作为身份提供者。我有一个 springboot-mvc-client 应用程序,它注册为机密客户端并配置了 authorization_code 授权类型。当我访问应用程序时,我被重定向到 Keycloak 登录页面,成功登录后,我可以看到我的 springboot-mvc-client 页面。 一切正常。
现在我有了另一个 springboot-rest-api,它是一个 ResourceServer。我已将 application.properties 配置如下:
server.port=8182
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8181/auth/realms/my-realm
现在我想从我的 springboot-mvc-client 访问 springboot-rest-api 端点。我捕获了 AccessToken 并使用 RestTemplate 作为 Authorization 标头传递,它也可以正常工作。
问题: 如果我在 keycloak 中将 springboot-rest-api 应用程序注册为具有 confidential 访问类型的客户端,并尝试从 springboot-mvc-client 访问 API > 然后 API 调用失败,响应是登录页面的 HTML 内容。
我的理解(可能是错误的)是因为两个客户端都在同一个领域注册,所以我应该能够使用从 springboot-mvc-client 身份验证获得的身份验证令牌调用 springboot-rest-api 端点.
额外观察是如果我将 springboot-rest-api 访问类型从 confidential 更改为 bearer-only然后它工作正常。另外,我可以使用 client_credentials 授权获取 springboot-rest-api 的 accessToken 并使用它我可以调用 springboot-rest-api 端点。
问题是:使用一个机密客户的访问令牌我们不能访问另一个机密客户的资源,即使他们在同一个领域?
PS: 更新 1:
将 OAuth 安全配置添加到 springboot-rest-api 它工作正常。 即,通过使用从 springboot-mvc-client 获得的相同 AccessToken 我能够调用 springboot-rest-api 端点。
我在 springboot-rest-api 中添加了以下配置:
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 的 ResourceServer 时,则不需要上面提到的 SecurityConfig 配置。但是如果我想让 springboot-rest-api 同时充当 OAuth Client + ResourceServer,那么我需要像上面提到的那样配置 SecurityConfig。
【问题讨论】:
标签: spring-boot oauth-2.0 keycloak spring-security-oauth2