为什么要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 应用程序中,检查会带来问题必须为所有客户服务。
在纯资源服务器上,clientDetailsService 可以为空。资源服务器可以在不知道注册客户端的情况下工作,同时仍然可以对访问令牌的其他属性强制执行安全性,例如资源 ID 和访问令牌的有效性。
在纯 Authorization Server 上没有问题,因为 Authorization Server 必须有一个 clientDetailsService,它知道可以为其颁发令牌的所有客户端。
然而,在混合服务器上,授权服务器可能不知道所有可能的客户端,因为可能存在其他授权服务器。然后,资源服务器组件将检查上述代码中的每个 clientId,并拒绝来自该授权服务器不知道的客户端的所有请求。
使场景易于理解的示例:
有一个混合服务器(授权和资源服务器合二为一)为业务用户发布令牌并为管理业务用户提供服务(例如创建、锁定、解锁等)。
还有一个单独的授权服务器为管理用户颁发令牌。管理用户使用 UI 来管理(例如创建、锁定、解锁等)业务用户,即他们使用 1. 的服务和 2. 发行的令牌。