【问题标题】:Why Resource Server has to know client_id in Spring OAuth2?为什么资源服务器必须知道 Spring OAuth2 中的 client_id?
【发布时间】:2019-08-28 03:16:31
【问题描述】:

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

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

据我了解,这个概念客户端应该使用客户端凭据从授权服务器获取他的访问令牌。然后在没有任何客户端凭据的情况下将此访问令牌发送到资源服务器。

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

【问题讨论】:

    标签: spring-security oauth-2.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 如何配置令牌信息端点

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-01-05
      • 2013-12-21
      • 2018-04-14
      • 2016-08-29
      • 2022-08-03
      • 2016-05-21
      • 2019-11-27
      • 2021-02-07
      • 2014-07-09
      相关资源
      最近更新 更多