不同服务器上的Spring OAuth授权服务器和资源服务器

时间:2017-11-26 16:27:28

标签: spring spring-security oauth spring-oauth2

我正在尝试配置弹出启动授权和资源服务器,每个服务器位于不同的服务器上。 The tutorial并未解释如何在不同服务器上配置资源和授权服务器。

  

如果您的资源服务器是一个单独的应用程序,那么您必须   确保您匹配授权服务器的功能   提供一个知道如何解码的ResourceServerTokenServices   令牌正确 [这意味着什么以及如何做到这一点?]

     

与DefaultTokenServices一样,选择主要通过   TokenStore(后端存储或本地编码)。另一种选择是   RemoteTokenServices是一个Spring OAuth功能(不属于   规范)允许资源服务器通过HTTP解码令牌   授权服务器上的资源(/ oauth / check_token)。   如果没有大量的RemoteTokenServices,它很方便   资源服务器中的流量(每个请求都必须通过验证   授权服务器),或者如果您能够负担缓存结果。   要使用/ oauth / check_token端点,您需要将其公开   更改其访问规则(默认为“denyAll()”)   AuthorizationServerSecurityConfigure与Authorization Server一样,您经常可以使用。

正如我所强调的那样,有一个建议的解决方案,资源服务器调用授权服务端点,但如上所述,只有在资源服务器中没有大量流量时才能这样做,但是如果实际存在呢?

2 个答案:

答案 0 :(得分:2)

假设您有Auth服务器,资源服务器和客户端应用程序。 您可以设置公共JWT密钥以验证传入令牌。这意味着您的用户通过客户端应用程序向Auth服务器提供其用户名和密码以获取有效令牌,此令牌由Aut​​h服务器中的公钥签名。然后每个客户端应用程序调用资源服务器需要提供该签名的令牌,并且您的资源服务器应用程序使用公钥来验证传入的令牌,而不是每次都调用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;
    }