最新の安定バージョンについては、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 クライアントフィルターを使用してください。