OAuth 2.0 资源服务器 Bearer Token

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

解析 Bearer Token

默认情况下,资源服务器会在 Authorization 头中寻找一个 bearer token。然而,你可以验证这个 token。

例如,你可能需要从一个自定义 header 中读取 bearer token。要做到这一点,你可以将 ServerBearerTokenAuthenticationConverter 的一个实例接入DSL。

Custom Bearer Token Header
  • 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 header 中传播该令牌—​比如说:

  • 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 header。

在你需要覆盖这一行为的地方,你可以自己提供header。

  • 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 客户端 filter function 不同,如果token过期,该 filter function 不会尝试更新token。