为什么资源服务器必须在Spring OAuth2中知道client_id?

时间:2019-04-06 11:23:33

标签: spring-security oauth-2.0

我正在使用Spring Boot实现OAuth2授权。我已经有授权服务器和资源服务器,现在我想使用client_credentials授予类型从资源服务器访问资源。

对此我有点困惑,因为在资源服务器中,我必须添加client_idclient_secret。但是为什么资源服务器真的需要它?

据我了解,此概念的客户端应使用客户端凭据从授权服务器获取其访问令牌。然后将此访问令牌发送到资源服务器,而无需任何客户端凭据。

那么为什么资源服务器还需要一些客户端凭据?资源服务器和客户端是两个分离的实体,我不明白为什么资源服务器必须了解client_idclient_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

1 个答案:

答案 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身份验证进行保护。

OAuth2 Boot

  

2.4如何配置令牌信息端点

     

令牌信息端点(有时也称为自省端点)可能需要某种客户端身份验证,即Basic或Bearer。一般来说,SecurityContext中的不记名令牌不足,因为它与用户相关。相反,您需要指定代表此客户端的凭据,如下所示:

spring:
  security:
    oauth2:
      client:
        clientId: client-id
        clientSecret: client-secret
      resource:
        tokenInfoUri: https://issuer/oauth2/check_token
     

默认情况下,这将使用基本身份验证和配置的凭据对令牌信息端点进行身份验证。