跳到主要内容
版本:5.0.1

TokenRelay GatewayFilter 工厂

DeepSeek V3 中英对照 TokenRelay GatewayFilter Factory TokenRelay GatewayFilter Factory

令牌中继是指 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

它是如何工作的?过滤器 会从当前已认证用户处提取一个 OAuth2 访问令牌,用于指定的 clientRegistrationId。如果未提供 clientRegistrationId,则使用当前已认证用户自身的访问令牌(在登录时获取)。无论哪种情况,提取出的访问令牌都会被放入下游请求的请求头中。

有关完整的工作示例,请参阅此项目。

备注

只有当设置了正确的 spring.security.oauth2.client.* 属性时,才会创建 TokenRelayGatewayFilterFactory bean,这将触发创建 ReactiveClientRegistrationRepository bean。

备注

TokenRelayGatewayFilterFactory 所使用的 ReactiveOAuth2AuthorizedClientService 默认实现使用了内存数据存储。如果你需要一个更健壮的解决方案,你需要提供你自己的 ReactiveOAuth2AuthorizedClientService 实现。