TokenRelay
GatewayFilter
工厂
TokenRelay
GatewayFilter
Factory
令牌中继(Token Relay)是指 OAuth2 消费者充当客户端,并将传入的令牌转发到外发的资源请求中。该消费者可以是纯客户端(如单点登录应用)或资源服务器。
Spring Cloud Gateway 可以通过 TokenRelay
GatewayFilter
将 OAuth2 访问令牌转发到其代理的下游服务。
TokenRelay
GatewayFilter
接受一个可选参数 clientRegistrationId
。以下示例配置了一个 TokenRelay
GatewayFilter
:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("resource", r -> r.path("/resource")
.filters(f -> f.tokenRelay("myregistrationid"))
.uri("http://localhost:9000"))
.build();
}
或者这个
spring:
cloud:
gateway:
routes:
- id: resource
uri: http://localhost:9000
predicates:
- Path=/resource
filters:
- TokenRelay=myregistrationid
上面的示例指定了一个 clientRegistrationId
,它可以用于获取并转发任何可用 ClientRegistration
的 OAuth2 访问令牌。
Spring Cloud Gateway 还可以转发当前认证用户的 OAuth2 访问令牌,oauth2Login()
用于认证用户。要将此功能添加到网关,您可以像这样省略 clientRegistrationId
参数:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("resource", r -> r.path("/resource")
.filters(f -> f.tokenRelay())
.uri("http://localhost:9000"))
.build();
}
或者这个
spring:
cloud:
gateway:
routes:
- id: resource
uri: http://localhost:9000
predicates:
- Path=/resource
filters:
- TokenRelay=
它将会(除了登录用户并获取令牌外)将认证令牌传递给下游服务(在本例中是 /resource
)。
要为 Spring Cloud Gateway 启用此功能,请添加以下依赖项
org.springframework.boot:spring-boot-starter-oauth2-client
它是如何工作的?filter 从当前认证用户中提取 OAuth2 访问令牌,用于提供的 clientRegistrationId
。如果没有提供 clientRegistrationId
,则使用当前认证用户自己的访问令牌(在登录时获得)。无论哪种情况,提取的访问令牌都会被放入下游请求的请求头中。
要查看完整的工作示例,请参见此项目。
只有在设置了正确的 spring.security.oauth2.client.*
属性时,才会创建 TokenRelayGatewayFilterFactory
bean,这将触发创建 ReactiveClientRegistrationRepository
bean。
TokenRelayGatewayFilterFactory
使用的 ReactiveOAuth2AuthorizedClientService
的默认实现使用内存数据存储。如果你需要一个更健壮的解决方案,你需要提供自己的 ReactiveOAuth2AuthorizedClientService
实现。