4 changed files with 132 additions and 105 deletions
@ -1,102 +0,0 @@
@@ -1,102 +0,0 @@
|
||||
[[servlet-webclient]] |
||||
== WebClient for Servlet Environments |
||||
|
||||
[NOTE] |
||||
==== |
||||
The following documentation is for use within Servlet environments. |
||||
For all other environments, refer to <<webclient, WebClient for Reactive>> environments. |
||||
==== |
||||
|
||||
|
||||
Spring Framework has built in support for setting a Bearer token. |
||||
|
||||
[source,java] |
||||
---- |
||||
webClient.get() |
||||
.headers(h -> h.setBearerAuth(token)) |
||||
... |
||||
---- |
||||
|
||||
Spring Security builds on this support to provide additional benefits: |
||||
|
||||
* Spring Security will automatically refresh expired tokens (if a refresh token is present) |
||||
* If an access token is requested and not present, Spring Security will automatically request the access token. |
||||
** For authorization_code this involves performing the redirect and then replaying the original request |
||||
** For client_credentials the token is simply requested and saved |
||||
* Support for the ability to transparently include the current OAuth token or explicitly select which token should be used. |
||||
|
||||
[[servlet-webclient-setup]] |
||||
=== WebClient OAuth2 Setup |
||||
|
||||
The first step is ensuring to setup the `WebClient` correctly. |
||||
An example of setting up `WebClient` in a servlet environment can be found below: |
||||
|
||||
[source,java] |
||||
---- |
||||
@Bean |
||||
WebClient webClient(ClientRegistrationRepository clientRegistrations, |
||||
OAuth2AuthorizedClientRepository authorizedClients) { |
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction oauth = |
||||
new ServletOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients); |
||||
// (optional) explicitly opt into using the oauth2Login to provide an access token implicitly |
||||
// oauth.setDefaultOAuth2AuthorizedClient(true); |
||||
// (optional) set a default ClientRegistration.registrationId |
||||
// oauth.setDefaultClientRegistrationId("client-registration-id"); |
||||
return WebClient.builder() |
||||
.apply(oauth2.oauth2Configuration()) |
||||
.build(); |
||||
} |
||||
---- |
||||
|
||||
[[servlet-webclient-implicit]] |
||||
=== Implicit OAuth2AuthorizedClient |
||||
|
||||
If we set `defaultOAuth2AuthorizedClient` to `true` in our setup and the user authenticated with oauth2Login (i.e. OIDC), then the current authentication is used to automatically provide the access token. |
||||
Alternatively, if we set `defaultClientRegistrationId` to a valid `ClientRegistration` id, that registration is used to provide the access token. |
||||
This is convenient, but in environments where not all endpoints should get the access token, it is dangerous (you might provide the wrong access token to an endpoint). |
||||
|
||||
[source,java] |
||||
---- |
||||
Mono<String> body = this.webClient |
||||
.get() |
||||
.uri(this.uri) |
||||
.retrieve() |
||||
.bodyToMono(String.class); |
||||
---- |
||||
|
||||
[[servlet-webclient-explicit]] |
||||
=== Explicit OAuth2AuthorizedClient |
||||
|
||||
The `OAuth2AuthorizedClient` can be explicitly provided by setting it on the request attributes. |
||||
In the example below we resolve the `OAuth2AuthorizedClient` using Spring WebFlux or Spring MVC argument resolver support. |
||||
However, it does not matter how the `OAuth2AuthorizedClient` is resolved. |
||||
|
||||
[source,java] |
||||
---- |
||||
@GetMapping("/explicit") |
||||
Mono<String> explicit(@RegisteredOAuth2AuthorizedClient("client-id") OAuth2AuthorizedClient authorizedClient) { |
||||
return this.webClient |
||||
.get() |
||||
.uri(this.uri) |
||||
.attributes(oauth2AuthorizedClient(authorizedClient)) |
||||
.retrieve() |
||||
.bodyToMono(String.class); |
||||
} |
||||
---- |
||||
|
||||
|
||||
[[servlet-webclient-clientregistrationid]] |
||||
=== clientRegistrationId |
||||
|
||||
Alternatively, it is possible to specify the `clientRegistrationId` on the request attributes and the `WebClient` will attempt to lookup the `OAuth2AuthorizedClient`. |
||||
If it is not found, one will automatically be acquired. |
||||
|
||||
[source,java] |
||||
---- |
||||
Mono<String> body = this.webClient |
||||
.get() |
||||
.uri(this.uri) |
||||
.attributes(clientRegistrationId("client-id")) |
||||
.retrieve() |
||||
.bodyToMono(String.class); |
||||
---- |
||||
Loading…
Reference in new issue