【问题标题】:Spring OAuth authorization server and resource server on different serversSpring OAuth授权服务器和资源服务器在不同的服务器上
【发布时间】:2018-05-09 22:47:39
【问题描述】:

我正在尝试配置 Spring Boot 授权和资源服务器,每个服务器都在不同的服务器上。 The tutorial 没有说明如何在不同的服务器上具体配置资源和授权服务器。

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

与 DefaultTokenServices 一样,选择主要通过 TokenStore(后端存储或本地编码)。另一种选择是 RemoteTokenServices 是 Spring OAuth 特性(不是 规范)允许资源服务器通过 HTTP 解码令牌 授权服务器上的资源 (/oauth/check_token)。 如果没有大量的远程令牌服务很方便 资源服务器中的流量(每个请求都必须通过 授权服务器),或者如果您有能力缓存结果。 要使用 /oauth/check_token 端点,您需要通过 在 AuthorizationServerSecurityConfigure与Authorization Server一样,可以经常使用。

据我了解,有一个建议的解决方案是资源服务器调用授权服务端点,但如上所述,这只能在资源服务器中没有大量流量的情况下完成,但如果确实存在呢?

【问题讨论】:

  • 认证服务器和资源服务器使用同一个数据库吗?
  • @dur 不,我不......你的意思是一种方法是共享同一个数据库?
  • 是的,我认为这是最简单的方法。另一种选择可能是 JWT。
  • 我有一个示例代码可以回答您的问题 - github.com/OhadR/oAuth2-sample。你可以在这里找到所有 3 个组件,每个都是一个单独的 WAR,可以部署在具有自己的 servlet 容器(例如 Tomcat)的不同机器上

标签: spring spring-security oauth spring-oauth2


【解决方案1】:

假设您有一个身份验证服务器、一个资源服务器和一个客户端应用程序。 您可以设置公共 JWT 密钥来验证传入的令牌。这意味着您的用户通过客户端应用程序将他的用户名和密码提供给 Auth 服务器以获取有效令牌,并且该令牌由 Auth 服务器中的公钥签名。然后,每个客户端应用程序调用资源服务器都需要提供该签名令牌,并且您的资源服务器应用程序使用公钥来验证传入的令牌,而不是每次都调用 Auth Server。

【讨论】:

    【解决方案2】:

    将此 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-04-05
      • 2013-04-20
      • 2015-05-14
      • 2018-05-07
      • 2018-08-29
      • 2020-04-10
      • 2015-05-14
      • 2016-05-21
      • 2014-07-09
      相关资源
      最近更新 更多