我正在使用Spring Boot实现OAuth2授权。我已经有授权服务器和资源服务器,现在我想使用client_credentials
授予类型从资源服务器访问资源。
对此我有点困惑,因为在资源服务器中,我必须添加client_id
和client_secret
。但是为什么资源服务器真的需要它?
据我了解,此概念的客户端应使用客户端凭据从授权服务器获取其访问令牌。然后将此访问令牌发送到资源服务器,而无需任何客户端凭据。
那么为什么资源服务器还需要一些客户端凭据?资源服务器和客户端是两个分离的实体,我不明白为什么资源服务器必须了解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
?
答案 0 :(得分:1)
如果您使用RemoteTokenServices
,则资源服务器也是授权服务器的附加客户端,请参见OAuth 2 Developers Guide:
另一种选择是
RemoteTokenServices
,它是Spring OAuth功能(不是规范的一部分),允许资源服务器通过授权服务器(/oauth/check_token
)上的HTTP资源解码令牌。如果资源服务器中流量不大(每个请求都必须通过授权服务器进行验证),或者您有能力缓存结果,那么RemoteTokenServices
会很方便。要使用/oauth/check_token
端点,您需要通过在AuthorizationServerSecurityConfigurer
中更改其访问规则(默认值为“ denyAll()”)来公开它,例如@Override public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { oauthServer.tokenKeyAccess("isAnonymous() || hasAuthority('ROLE_TRUSTED_CLIENT')").checkTokenAccess( "hasAuthority('ROLE_TRUSTED_CLIENT')"); }
在此示例中,我们同时配置了
/oauth/check_token
端点和/oauth/token_key
端点(因此受信任的资源可以获得用于JWT验证的公钥)。这两个端点通过使用客户端凭据的HTTP Basic身份验证进行保护。
2.4如何配置令牌信息端点
令牌信息端点(有时也称为自省端点)可能需要某种客户端身份验证,即Basic或Bearer。一般来说,
SecurityContext
中的不记名令牌不足,因为它与用户相关。相反,您需要指定代表此客户端的凭据,如下所示:spring: security: oauth2: client: clientId: client-id clientSecret: client-secret resource: tokenInfoUri: https://issuer/oauth2/check_token
默认情况下,这将使用基本身份验证和配置的凭据对令牌信息端点进行身份验证。