SpringCloud 资源服务器令牌中继
如果您的应用具有@EnableResourceServer
,则您可能希望将传入令牌下游中继到其他服务。如果您使用RestTemplate
与下游服务联系,那么这只是如何在正确的上下文中创建模板的问题。
如果您的服务使用UserInfoTokenServices
对传入令牌进行身份验证(即它使用的是security.oauth2.user-info-uri
配置),那么您可以使用自动连接的OAuth2ClientContext
简单地创建一个OAuth2RestTemplate
(它将由身份验证填充)在到达后端代码之前进行处理)。等效地(对于Spring Boot 1.4),您可以注入UserInfoRestTemplateFactory
,并在您的配置中获取其OAuth2RestTemplate
。例如:
MyConfiguration.java。
@Bean public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) { return factory.getUserInfoRestTemplate(); }
然后,该其余模板将具有与身份验证过滤器使用的相同的OAuth2ClientContext
(请求范围),因此您可以使用它来发送具有相同访问令牌的请求。
如果您的应用未使用UserInfoTokenServices
,但仍是客户端(即它声明了@EnableOAuth2Client
或@EnableOAuth2Sso
),则使用Spring Security覆盖用户从{12创建的任何OAuth2RestOperations
/} OAuth2Context
也将转发令牌。默认情况下,此功能作为MVC处理程序拦截器实现,因此仅在Spring MVC中有效。如果您不使用MVC,则可以使用包装AccessTokenContextRelay
的自定义过滤器或AOP拦截器来提供相同的功能。
这是一个基本示例,展示了如何使用在其他位置创建的自动连接的休息模板(“ foo.com”是接受与周围应用程序相同的令牌的资源服务器):
MyController.java。
@Autowired private OAuth2RestOperations restTemplate; @RequestMapping("/relay") public String relay() { ResponseEntity<String> response = restTemplate.getForEntity("https://foo.com/bar", String.class); return "Success! (" + response.getBody() + ")"; }
如果您不希望转发令牌(这是一个有效的选择,因为您可能想扮演自己的角色,而不是发送令牌的客户端),那么您只需要创建自己的OAuth2Context
自动装配默认值。
Feign客户端还将选择使用OAuth2ClientContext
的拦截器(如果可用),因此它们还应在RestTemplate
可以使用的任何地方进行令牌中继。
更多建议: