配置多个 OAuth2 授权服务器和单个资源服务器之间的通信

Posted

技术标签:

【中文标题】配置多个 OAuth2 授权服务器和单个资源服务器之间的通信【英文标题】:Configure communication between multiple OAuth2 authorization servers and a single resource server 【发布时间】:2019-10-08 05:17:38 【问题描述】:

我目前正在设置一个资源服务器,它将验证来自各种授权服务器的访问令牌。

Spring 安全(也使用 Okta 安全启动器)似乎只允许我设置单个颁发者 URI。

我设法找到了一个可行的解决方案,但我不确定这是否是最佳实践/标准方法。在下面的代码 sn-p 中,为简单起见,我使用 Spring 的 Java Config 明确设置了资源。

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) 
  http
      .authorizeExchange()
      .pathMatchers("/api/protected/by/authserver1")
      .and()
      .oauth2ResourceServer()
      .jwt()
          .jwtDecoder(ReactiveJwtDecoders.fromOidcIssuerLocation("https://authserver1")
      .and()
      .and()
      .authorizeExchange()
      .pathMatchers("/api/protected/by/authserver2")
      .and()
      .oauth2ResourceServer()
      .jwt()
          .jwtDecoder(ReactiveJwtDecoders.fromOidcIssuerLocation("https://authserver2");

  return http.build()

这似乎完全按预期工作,从一个身份验证服务器铸造并在端点上用于验证另一个接收 401 的令牌。当铸造的令牌在其各自的端点上使用时,它们被成功验证。

.and() 连续调用看起来有点好笑,我的印象是这些链接调用只是在后台创建多个 Web 过滤器?无论哪种方式,这是在具有 Spring Security 和 WebFlux 的 Spring 应用程序中启用此功能的标准方式吗?

此外,我遇到了this SO 问题,但我不知道我能否在该项目的上下文中设置“联合提供者”。但是,如果这种方法是我想知道的最佳实践。但是,我认为这在某种程度上发生在 Okta 级别,身份验证服务器访问策略上的联合代理模式......?

【问题讨论】:

【参考方案1】:

无论哪种方式,这是在具有 Spring Security 和 WebFlux 的 Spring 应用程序中启用此功能的标准方式吗?

没有。更重要的是,您提供的示例将不起作用。您可以调查ServerHttpSecurity 实现并了解原因。实际上,当您调用oauth2ResourceServer() 时,它会设置新的OAuth2ResourceServerSpec 或返回可以修改的旧的。因此,在您的情况下,只会应用第二个 JwtDecoder,因为它会覆盖第一个。如果您想为每个路径配置 oauth2ResourceServer,则必须定义多个 SecurityWebFilterChain ,此处发布为 https://***.com/a/54792674/1646298。

【讨论】:

以上是关于配置多个 OAuth2 授权服务器和单个资源服务器之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# OAuth2.0授权码模式实战

SpringSecurity的OAuth2的授权服务器配置

SpringSecurity的OAuth2的授权服务器配置

SpringSecurity的OAuth2的授权服务器配置

Spring security OAuth2 资源服务器 JWT 授权错误

Spring Security实现OAuth2.0——资源服务