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 已過期。 |