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 を提供する必要があります。 |