如何使用Spring Cloud Security实现OAuth2"令牌交换"

mig*_*gar 13 spring spring-boot spring-cloud spring-oauth2

我想知道是否有人举例说明如何使用Spring Cloud Security(使用OAuth2)实现"令牌交换"技术.

目前,我已经在微服务环境中使用ZuulProxy实现了"令牌中继"技术,以"中继"OAuth2令牌并实现SSO.这很好,但暗示每个微服务使用相同的clientId(在ZuulProxy设置中指定为ZuulProxy仅使用authorization_code grant类型和clientId提供的中继).但是,对于微服务内部调用,我想"交换"令牌.这意味着在某些情况下,ZuulProxy中继的令牌不是我需要用来验证/授权微服务A作为微服务B的客户端的令牌.

Spring Cloud参考文档目前说:"基于Spring Boot和Spring Security OAuth2,我们可以快速创建实现常见模式的系统,如单点登录,令牌中继和令牌交换." (http://cloud.spring.io/spring-cloud-security/spring-cloud-security.html)

我想在参考文档中使用"Token Exchange"它们意味着OAuth2的这个扩展的实现,在本规范中解释,这基本上是我需要的:https: //tools.ietf.org/html/draft-ietf- OAuth的令牌交换-03

正如我所说,我了解如何使用SSO和令牌中继,但我无法在参考文档中看到有关如何实现"令牌交换"的进一步说明.我也无法找到实现示例.

有谁知道在哪里可以找到更多信息或示例?

非常感谢!

Rya*_*ugh 2

我很好奇为什么您需要“交换”令牌才能从微服务 A 向微服务 B 进行调用,以及为什么中继还不够?您想通过交换服务间请求的令牌来实现什么目的?

我们的设置与Nordic API 条目中描述的非常相似。简而言之,外部调用者使用不透明令牌,但是一旦请求通过我们的网关,每个微服务都会获得相同令牌的 JWT 表示。我们必须实现一个自定义端点来执行不透明的 JWT 交换。当服务需要相互交互时,当A需要调用B时,我们不交换令牌,我们只是中继令牌。RestTemplate 或 Feign 客户端都会自动将令牌从 A 转发到 B。因此,上下文不会丢失。

现在,如果我们想要控制访问,JWT 可以指定受众值的集合,或者我们可以通过范围强制访问。实际上,我们正在根据用例将两者结合起来。

交换令牌并不是一个便宜的操作,事实上,它的规模相当昂贵,并且应该真正考虑为什么需要为服务内通信进行令牌交换。如果您的每个 API 请求都会导致服务 A 调用服务 B,并且您必须进行令牌交换,那么您将需要确保您的授权服务可以处理该类型的工作负载。最后,IETF 代币交换仍处于草案状态,并且在其发展过程中发生了很大变化,因此在规范接近最终确定之前,我不会对实施建议抱有太多期望。