最新の安定バージョンについては、Spring Security 6.3.1 を使用してください! |
OAuth 2.0 リソースサーバーベアラートークン
ベアラートークンの解決
デフォルトでは、リソースサーバーは Authorization
ヘッダーで無記名トークンを探します。ただし、これはカスタマイズできます。
例: カスタムヘッダーから無記名トークンを読み取る必要がある場合があります。これを実現するには、次の例に示すように、ServerBearerTokenAuthenticationConverter
のインスタンスを DSL に接続できます。
カスタムベアラートークンヘッダー
Java
Kotlin
ServerBearerTokenAuthenticationConverter converter = new ServerBearerTokenAuthenticationConverter();
converter.setBearerTokenHeaderName(HttpHeaders.PROXY_AUTHORIZATION);
http
.oauth2ResourceServer(oauth2 -> oauth2
.bearerTokenConverter(converter)
);
val converter = ServerBearerTokenAuthenticationConverter()
converter.setBearerTokenHeaderName(HttpHeaders.PROXY_AUTHORIZATION)
return http {
oauth2ResourceServer {
bearerTokenConverter = converter
}
}
ベアラートークンの伝播
これでベアラートークンを所有しているため、それをダウンストリームサービスに渡すと便利かもしれません。ServerBearerExchangeFilterFunction (Javadoc)
では、これは非常に簡単です。次の例で確認できます。
Java
Kotlin
@Bean
public WebClient rest() {
return WebClient.builder()
.filter(new ServerBearerExchangeFilterFunction())
.build();
}
@Bean
fun rest(): WebClient {
return WebClient.builder()
.filter(ServerBearerExchangeFilterFunction())
.build()
}
上記の WebClient
を使用してリクエストを実行すると、Spring Security は現在の Authentication
を検索し、AbstractOAuth2Token (Javadoc)
資格情報を抽出します。次に、Authorization
ヘッダーでそのトークンを伝搬します。
例:
Java
Kotlin
this.rest.get()
.uri("https://other-service.example.com/endpoint")
.retrieve()
.bodyToMono(String.class)
this.rest.get()
.uri("https://other-service.example.com/endpoint")
.retrieve()
.bodyToMono<String>()
other-service.example.com/endpoint (英語)
を呼び出して、ベアラートークン Authorization
ヘッダーを追加します。
この動作をオーバーライドする必要がある場所では、次のようにヘッダーを自分で指定するだけです。
Java
Kotlin
this.rest.get()
.uri("https://other-service.example.com/endpoint")
.headers(headers -> headers.setBearerAuth(overridingToken))
.retrieve()
.bodyToMono(String.class)
rest.get()
.uri("https://other-service.example.com/endpoint")
.headers { it.setBearerAuth(overridingToken) }
.retrieve()
.bodyToMono<String>()
この場合、フィルターはフォールバックし、リクエストを Web フィルターチェーンの残りの部分に単純に転送します。
OAuth 2.0 クライアントフィルター機能 (Javadoc) とは異なり、このフィルター関数は、トークンが期限切れになった場合、トークンを更新しようとしません。このレベルのサポートを取得するには、OAuth 2.0 クライアントフィルターを使用してください。 |