TokenRelay GatewayFilter ファクトリ
トークンリレーは、OAuth2 コンシューマーがクライアントとして機能し、受信トークンを発信リソースリクエストに転送する場所です。コンシューマーは、純粋なクライアント(SSO アプリケーションなど)またはリソースサーバーにすることができます。
Spring Cloud Gateway は、TokenRelay GatewayFilter を使用して、プロキシしているサービスに OAuth2 アクセストークンをダウンストリームに転送できます。
TokenRelay GatewayFilter は、オプションのパラメーター clientRegistrationId を 1 つ受け取ります。次の例では、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
どのように機能するのでしょうか ? フィルター [GitHub] (英語) は、指定された clientRegistrationId に対して現在認証されているユーザーから OAuth2 アクセストークンを抽出します。clientRegistrationId が指定されていない場合は、現在認証されているユーザー自身のアクセストークン (ログイン中に取得される) が使用されます。どちらの場合も、抽出されたアクセストークンは、ダウンストリームリクエストのリクエストヘッダーに配置されます。
完全に機能するサンプルについては、このプロジェクト [GitHub] (英語) を参照してください。
TokenRelayGatewayFilterFactory Bean は、ReactiveClientRegistrationRepository Bean の作成をトリガーする適切な spring.security.oauth2.client.* プロパティが設定されている場合にのみ作成されます。 |
TokenRelayGatewayFilterFactory によって使用される ReactiveOAuth2AuthorizedClientService のデフォルトの実装は、インメモリデータストアを使用します。より堅牢なソリューションが必要な場合は、独自の実装 ReactiveOAuth2AuthorizedClientService を提供する必要があります。 |