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