【发布时间】:2019-08-28 03:16:31
【问题描述】:
我正在使用 Spring Boot 实现 OAuth2 授权。我已经有了授权服务器和资源服务器,现在我想使用client_credentials授权类型从资源服务器访问资源。
我对此有点困惑,因为在资源服务器中我必须添加client_id 和client_secret。但是为什么 Resource Server 真的需要它呢?
据我了解,这个概念客户端应该使用客户端凭据从授权服务器获取他的访问令牌。然后在没有任何客户端凭据的情况下将此访问令牌发送到资源服务器。
那么为什么资源服务器还需要一些客户端凭据呢?资源服务器和客户端是两个独立的实体,我不明白为什么资源服务器必须知道client_id 和client_secret。
为什么访问令牌不足以进行身份验证? check_token 端点可以返回可以使用此令牌访问的资源列表,如果客户端拥有此令牌,这意味着他已经使用客户端凭据进行了身份验证以获取此令牌。
如果我想从多个不同的客户端访问这个资源服务器怎么办?
资源服务器配置:
@Configuration
@RestController
@EnableWebSecurity
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and()
.httpBasic().disable();
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources
.resourceId("translate-service");
}
}
资源服务器属性:
security.oauth2.resource.user-info-uri=http://localhost:8090/user
security.oauth2.resource.token-info-uri=http://localhost:8090/oauth/check_token
security.oauth2.client.client-id=XXXX
security.oauth2.client.client-secret=XXXX
如果我不设置客户端属性,Spring 将记录警告:
检测到空客户端 ID 或客户端密码。需要身份验证的端点将拒绝请求并返回 401 错误。
身份验证将不起作用。
也许我做错了什么,有一些解决方案可以在资源服务器中不提供client_id?
【问题讨论】: