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