OAuth 2.0 リソースサーバーベアラートークン
ベアラートークンの解決
デフォルトでは、ResourceServer は 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) とは異なり、このフィルター関数は、トークンの有効期限が切れた場合でも、トークンの更新を試みません。 |