TokenRelay GatewayFilter ファクトリ

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

Spring Cloud Gateway は、TokenRelay GatewayFilter を使用して、プロキシしているサービスに OAuth2 アクセストークンをダウンストリームに転送できます。

TokenRelay GatewayFilter は、オプションのパラメーター clientRegistrationId を 1 つ受け取ります。次の例では、TokenRelay GatewayFilter を構成します。

App.java
@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();
}

またはこれ

application.yaml
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 パラメーターを省略できます。

App.java
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("resource", r -> r.path("/resource")
                    .filters(f -> f.tokenRelay())
                    .uri("http://localhost:9000"))
            .build();
}

またはこれ

application.yaml
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

どのように機能するのでしょうか ? フィルター [GitHub] (英語) は、指定された clientRegistrationId に対して現在認証されているユーザーから OAuth2 アクセストークンを抽出します。clientRegistrationId が指定されていない場合は、現在認証されているユーザー自身のアクセストークン (ログイン中に取得される) が使用されます。どちらの場合も、抽出されたアクセストークンは、ダウンストリームリクエストのリクエストヘッダーに配置されます。

完全に機能するサンプルについては、このプロジェクト [GitHub] (英語) を参照してください。

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