TokenRelay フィルター
トークンリレーは、OAuth2 コンシューマーがクライアントとして機能し、受信トークンを発信リソースリクエストに転送する場所です。コンシューマーは、純粋なクライアント(SSO アプリケーションなど)またはリソースサーバーにすることができます。
Spring Cloud Gateway サーバー MVC は、TokenRelay フィルターを使用してプロキシしているサービスに OAuth2 アクセストークンをダウンストリーム転送できます。
TokenRelay フィルターは、オプションパラメーター clientRegistrationId を 1 つ受け取ります。次の例では、TokenRelay フィルターを設定しています。
@Configuration
class RouteConfiguration {
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctionsTokenRelay() {
return route("resource")
.GET("/resource", http())
.before(uri("https://localhost:9000"))
.filter(tokenRelay("myregistrationid"))
.build();
}
}またはこれ
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 パラメーターを省略します。
@Configuration
class RouteConfiguration {
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctionsTokenRelay() {
return route("resource")
.GET("/resource", http())
.before(uri("https://localhost:9000"))
.filter(tokenRelay())
.build();
}
}またはこれ
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 を提供する必要があります。 |