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

Posted

技术标签:

【中文标题】Spring OAuth授权服务器和资源服务器在不同的服务器上【英文标题】:Spring OAuth authorization server and resource server on different servers 【发布时间】: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)的不同机器上 【参考方案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;
    

【讨论】:

以上是关于Spring OAuth授权服务器和资源服务器在不同的服务器上的主要内容,如果未能解决你的问题,请参考以下文章

Spring OAuth2 资源和授权服务器

spring-boot oauth2 拆分授权服务器和资源服务器

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

Spring OAuth:带有授权服务器后端的资源服务器

Spring oAuth2 with JWT 使用不同的授权和资源服务器

Spring Boot 资源服务器无法使用 oAuth 2 访问令牌授权角色