OAuth 2.0 資源伺服器 Bearer Tokens

Bearer Token 解析

預設情況下,資源伺服器會在 Authorization 標頭中尋找 bearer token。但是,您可以驗證此 token。

例如,您可能需要從自訂標頭讀取 bearer token。若要這麼做,您可以將 ServerBearerTokenAuthenticationConverter 的執行個體連結到 DSL 中

自訂 Bearer Token 標頭
  • 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
    }
}

Bearer Token 傳播

現在您有了 bearer token,您可以將其傳遞至下游服務。這可以使用 ServerBearerExchangeFilterFunction 來完成

  • 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 憑證。然後,它會在 Authorization 標頭中傳播該 token — 例如

  • 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,並為您新增 bearer token 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 用戶端篩選器功能 不同,此篩選器功能不會嘗試續訂 token,即使 token 已過期。