TokenRelay フィルター

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

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

TokenRelay フィルターは、オプションパラメーター clientRegistrationId を 1 つ受け取ります。次の例では、TokenRelay フィルターを設定しています。

RouteConfiguration.java
@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsTokenRelay() {
        return route("resource")
            .GET("/resource", http())
            .before(uri("https://localhost:9000"))
            .filter(tokenRelay("myregistrationid"))
            .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 サーバー MVC は、現在認証されているユーザーの OAuth2 アクセストークンを転送できます。oauth2Login() はユーザーの認証に使用されます。この機能をゲートウェイに追加するには、次のように clientRegistrationId パラメーターを省略します。

RouteConfiguration.java
@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsTokenRelay() {
        return route("resource")
            .GET("/resource", http())
            .before(uri("https://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

どのように動作するのでしょうか? フィルターは、提供された clientRegistrationId に対して、現在認証されているユーザーから OAuth2 アクセストークンを抽出します。clientRegistrationId が提供されていない場合は、現在認証されているユーザー自身のアクセストークン(ログイン時に取得)が使用され、抽出されたアクセストークンは下流リクエストのリクエストヘッダーに配置されます。

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