TokenRelay フィルター

トークンリレーは、OAuth2 コンシューマーがクライアントとして機能し、受信トークンを発信リソースリクエストに転送する場所です。コンシューマーは、純粋なクライアント(SSO アプリケーションなど)またはリソースサーバーにすることができます。

Spring Cloud Gateway サーバー MVC は、現在認証されているユーザーの OAuth2 アクセストークンを転送できます。ユーザーの認証には oauth2Login() が使用されます。

RouteConfiguration.java
import static org.springframework.cloud.gateway.server.mvc.filter.TokenRelayFilterFunctions.tokenRelay;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
		return route("resource")
			.GET("/resource", http("http://localhost:9000"))
				.filter(tokenRelay())
				.build();
    }
}

またはこれ

application.yaml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: resource
          uri: http://localhost:9000
          predicates:
          - Path=/resource
          filters:
          - TokenRelay=

そして、(ユーザーのログインとトークンの取得に加えて)認証トークンをサービス(この場合は /resource)にダウンストリームで渡します。

Spring Cloud Gateway サーバー MVC でこれを有効にするには、次の依存関係を追加します。

  • org.springframework.boot:spring-boot-starter-oauth2-client

どのように機能するのでしょうか ? 現在認証されているユーザー自身のアクセストークン (ログイン時に取得) が使用され、抽出されたアクセストークンはダウンストリームリクエストのリクエストヘッダーに配置されます。

トークンリレーフィルターは、OAuth2AuthorizedClientManager Bean の作成をトリガーする適切な spring.security.oauth2.client.* プロパティが設定されている場合にのみ機能します。
トークンリレーフィルターで使用されるデフォルトの実装では、メモリ内データストアが使用されます。より堅牢なソリューションが必要な場合は、独自の実装 OAuth2AuthorizedClientService を提供する必要があります。