为什么Spring Security OAuth2 DefaultTokenServices在加载身份验证时检查clientId?

时间:2014-11-07 18:02:45

标签: oauth spring-security oauth-2.0 spring-security-oauth2

为什么DefaultTokenServices检查方法clientId中的loadAuthentication

    if (clientDetailsService != null) {
        String clientId = result.getOAuth2Request().getClientId();
        try {
            clientDetailsService.loadClientByClientId(clientId);
        }
        catch (ClientRegistrationException e) {
            throw new InvalidTokenException("Client not valid: " + clientId, e);
        }
    }

以上是问题,以下只是解释我为什么想出它的背景。我要问的原因是一个特殊情况:如果授权服务器不是所有客户端的负责人,而是资源服务器,那么检查会在例如资源服务器和授权服务器的Spring Boot应用程序中产生问题。必须为所有客户服务。

在纯资源服务器上,clientDetailsS​​ervice可以为null。资源服务器可以在不知道已注册客户端的情况下工作,而安全性仍可以在访问令牌的其他属性上强制执行,例如资源ID和访问令牌的有效性。

在纯Authorization Server上,没有问题,因为Authorization Server必须有一个clientDetailsS​​ervice,它知道可以发出令牌的所有客户端。

但是,在混合服务器上,授权服务器可能不知道所有可能的客户端,因为可能存在其他授权服务器。然后,Resource Server组件将检查上述代码中的每个clientId,并拒绝来自此授权服务器不知道的客户端的所有请求。

使场景可理解的示例:

  1. 混合服务器(授权和资源服务器合二为一)为业务用户发放令牌,并提供管理业务用户的服务(例如创建,锁定,解锁等)。

    < / LI>
  2. 还有一个单独的授权服务器为管理用户颁发令牌。管理用户使用UI来管理(例如创建,锁定,解锁等)业务用户,即他们使用1的服务与2发布的令牌。

1 个答案:

答案 0 :(得分:0)

我想我并没有真正遵循使得必须隔离客户端的逻辑。在任何情况下,我都认为资源服务器和授权端点必须共享相同的*TokenServices(它们甚至不使用相同的接口)。