I created a CustomTokenRelayGatewayFilterFactory and it works fine. But I also want to refresh the Id token, does anyone have an idea how I can go about that?
private Mono<OAuth2AuthorizedClient> refreshAuthorizedClient(
final ServerWebExchange exchange,
final OAuth2AuthorizedClient authorizedClient,
final OAuth2AuthenticationToken oauth2Authentication) {
final ClientRegistration clientRegistration = authorizedClient.getClientRegistration();
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(clientRegistration.getClientId(), clientRegistration.getClientSecret());
headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
return webClientBuilder.build()
.method(HttpMethod.POST)
.uri(clientRegistration.getProviderDetails().getTokenUri())
.headers(header -> header.addAll(headers))
.bodyValue(refreshTokenBody(authorizedClient.getRefreshToken().getTokenValue()))
.exchangeToMono(refreshResponse -> {
if (refreshResponse.statusCode().equals(HttpStatus.BAD_REQUEST)) {
System.err.println("The refresh token or sessions expired.");
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, TOKEN_REFRESHMENT_ERROR_MESSAGE);
} else {
return refreshResponse.body(oauth2AccessTokenResponse());
}
})
.map(accessTokenResponse -> {
OAuth2RefreshToken refreshToken = Optional.ofNullable(accessTokenResponse.getRefreshToken())
.orElse(authorizedClient.getRefreshToken());
System.err.println(accessTokenResponse.getAdditionalParameters());
return new OAuth2AuthorizedClient(authorizedClient.getClientRegistration(), authorizedClient.getPrincipalName(), accessTokenResponse.getAccessToken(), refreshToken);
})
.flatMap(result -> this.authorizedClientRepository.saveAuthorizedClient(result, oauth2Authentication, exchange).thenReturn(result));
}
private static MultiValueMap<String, String> refreshTokenBody(final String refreshToken) {
final MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
body.add(GRANT_TYPE_KEY, AuthorizationGrantType.REFRESH_TOKEN.getValue());
body.add(REFRESH_TOKEN_KEY, refreshToken);
return body;
}