我正在尝试配置弹出启动授权和资源服务器,每个服务器位于不同的服务器上。 The tutorial并未解释如何在不同服务器上配置资源和授权服务器。
如果您的资源服务器是一个单独的应用程序,那么您必须 确保您匹配授权服务器的功能 提供一个知道如何解码的ResourceServerTokenServices 令牌正确。 [这意味着什么以及如何做到这一点?]
与DefaultTokenServices一样,选择主要通过 TokenStore(后端存储或本地编码)。另一种选择是 RemoteTokenServices是一个Spring OAuth功能(不属于 规范)允许资源服务器通过HTTP解码令牌 授权服务器上的资源(/ oauth / check_token)。 如果没有大量的RemoteTokenServices,它很方便 资源服务器中的流量(每个请求都必须通过验证 授权服务器),或者如果您能够负担缓存结果。 要使用/ oauth / check_token端点,您需要将其公开 更改其访问规则(默认为“denyAll()”) AuthorizationServerSecurityConfigure与Authorization Server一样,您经常可以使用。
正如我所强调的那样,有一个建议的解决方案,资源服务器调用授权服务端点,但如上所述,只有在资源服务器中没有大量流量时才能这样做,但是如果实际存在呢?
答案 0 :(得分:2)
假设您有Auth服务器,资源服务器和客户端应用程序。 您可以设置公共JWT密钥以验证传入令牌。这意味着您的用户通过客户端应用程序向Auth服务器提供其用户名和密码以获取有效令牌,此令牌由Auth服务器中的公钥签名。然后每个客户端应用程序调用资源服务器需要提供该签名的令牌,并且您的资源服务器应用程序使用公钥来验证传入的令牌,而不是每次都调用Auth Server。
答案 1 :(得分:0)
将此bean添加到资源服务器中,就可以使用单个授权服务器来保护多个资源api:
@Primary
@Bean
public RemoteTokenServices tokenService() {
RemoteTokenServices tokenService = new RemoteTokenServices();
tokenService.setCheckTokenEndpointUrl(
"http://localhost:8080/spring-security-oauth-server/oauth/check_token");
tokenService.setClientId("fooClientIdPassword");
tokenService.setClientSecret("secret");
return tokenService;
}