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) とは異なり、このフィルター関数は、トークンの有効期限が切れた場合でも、トークンの更新を試みません。 |