令牌中继是 OAuth2 使用者充当客户端并将传入令牌转发给传出资源请求的地方。使用者可以是纯客户端(如 SSO 应用程序)或资源服务器。 如果你的应用程序也有一个 Spring Cloud Gateway 嵌入的反向代理,那么可以要求它将 OAuth2 访问令牌转发到它所代理的服务的下游。因此,上面的 SSO 应用程序可以这样简单地进行增强: App.java. @Autowired private TokenRelayGatewayFilterFactory filterFactory; @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("resource", r -> r.path("/resource") .filters(f -> f.filter(filterFactory.apply())) .uri("http://localhost:9000")) .build(); } 或者这样 application.yaml. spring: cloud: gateway: routes: - id: resource uri: http://localhost:9000 predicates: - Path=/resource filters: - TokenRelay=
它将(除了登录用户并获取令牌)将身份验证令牌传递给下游的服务(在本例中是 要为 Spring Cloud Gateway 启用此功能,请添加以下依赖项
它是如何工作的?过滤器从当前已验证的用户中提取访问令牌,并将其放入下游请求的请求头中。 有关完整的工作示例,请参阅此项目。
如果你的应用程序是面向 OAuth2 客户端的用户(即已声明
如果你的应用程序还具有 Spring Cloud Zuul 嵌入式反向代理(使用 app.groovy. @Controller @EnableOAuth2Sso @EnableZuulProxy class Application { }
它将(除了登录用户并获取令牌)将身份验证令牌传递给下游的
它是如何工作的?
如果你的应用程序有
如果你的服务使用 MyConfiguration.java. @Bean public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) { return factory.getUserInfoRestTemplate(); }
然后,此 rest 模板将具有身份验证过滤器使用的相同
如果你的应用程序不使用 下面是一个基本示例,展示了在其他地方创建的自动装配 rest 模板的使用("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() + ")"; }
如果你不想转发令牌(这是一个有效的选择,因为你可能想扮演自己的角色,而不是发送令牌的客户端),那么只需要创建自己的
如果 |